Как я могу преобразовать указатель-метод некоторого класса в указатель-функцию?
Приветствую всех! У меня есть метод указатель на функцию
int Myclass::*myMethod(char* a,char* b){
//some code
}
И попробуй запустить
bool Myclass::myMethod2(){
AnotherClass *instance = AnotherClass:getInstance();
instance-> addParams(&myMethod);
return true;
}
AnotherClass - это класс в другой dll. Определение другого класса
class AnotherClass
{
//friend class Myclass;
public:
static AnotherClass* getInstance();
void addParams(int (*myMethod)(char*, char*) =0);
//I try so void addParams(int (Myclass::*myMethod)(char*, char*) =0);
};
И есть ошибка C2664. Невозможно преобразовать параметр 1 из 'int Myclass::* (__cdecl *)(char *,char *) "в" int (__cdecl *)(char *,char *).
Хм.. Что мне делать?
3 ответа
Ты не можешь
addParams()
Метод нуждается в функции, которая принимает два char*
аргументы.
Myclass::myMethod
принимает два char*
аргументы и Myclass
объект.
Там нет никакого способа сделать два совместимых.
РЕДАКТИРОВАТЬ: Я немного неправильно понял ваш вопрос, и не заметил ничего о DLL - но один и три все еще применяются, если у вас есть контроль над DLL, и вы хотите изменить его. Если нет, все, что вы можете сделать, это номер два.
В этом случае вы можете сделать три вещи:
Во-первых, измените способ вашего AnotherClass
разработан путем объявления addParams
вот так:
void addParams(int (Myclass::*)(char*, char*) =0);
Во-вторых, вы могли бы сделать Myclass::myMethod()
статический член, а затем ваше первоначальное объявление addParams
должно сработать.
В-третьих, вы можете использовать библиотеку типа boost, чтобы связать метод следующим образом:
bool Myclass::myMethod2(){
AnotherClass *instance = AnotherClass:getInstance();
instance-> addParams(boost::bind(&Myclass::myMethod, this));
return true;
}
class AnotherClass
{
//...
void addParams(boost::function<int(char*, char*)>);
};
Вы вызываете метод из экземпляра объекта. (Предполагая, что Myclass::myMethod2() не является статичным)
Вы можете вызвать метод из этого:
instance-> addParams(&(this->myMethod));