Как я могу преобразовать указатель-метод некоторого класса в указатель-функцию? - PullRequest
2 голосов
/ 18 июля 2011

Приветствую всех! У меня есть метод указатель на функцию

int Myclass::*myMethod(char* a,char* b){
  //some code
}

И попробуй запустить

bool Myclass::myMethod2(){
    AnotherClass *instance = AnotherClass:getInstance();
    instance-> addParams(&myMethod);
    return true;
}

AnotherClass - это класс в другой dll. Определение AnotherClass

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 ]

2 голосов
/ 18 июля 2011

РЕДАКТИРОВАТЬ : Я немного неправильно понял ваш вопрос и не заметил ничего о 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*)>);
};
2 голосов
/ 18 июля 2011

Вы не можете.

Метод addParams() нуждается в функции, которая принимает два char* аргумента.

Myclass::myMethod принимает два char* аргумента и Myclass объект .

Невозможно сделать два совместимых.

0 голосов
/ 18 июля 2011

Вы вызываете метод из экземпляра объекта. (Предполагается, что Myclass :: myMethod2 () не является статичным)

Вы можете вызвать метод из этого:

instance-> addParams(&(this->myMethod));
...