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

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

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));
Другие вопросы по тегам