如何将某些类的指针方法转换为指针函数?

时间:2011-07-18 09:57:42

标签: c++ pointers callback function-pointers c2664

恭喜每个人!我有一个函数指针方法

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 个答案:

答案 0 :(得分:2)

你做不到。

addParams()方法需要一个接受两个char*参数的函数。

Myclass::myMethod接受两个char*参数和一个 Myclass 对象

没有办法让两者兼容。

答案 1 :(得分:2)

编辑:我稍微误读了你的问题,并没有注意到关于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 :(得分:0)

您正在从对象的实例内部调用该方法。 (假设 Myclass :: myMethod2()不是静态的)

您可以通过以下方式调用该方法:

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