【问题标题】:How can i convert pointer-method of some class to pointer-function?如何将某个类的指针方法转换为指针函数?
【发布时间】:2011-07-18 09:57:41
【问题描述】:

大家好!我有一个函数指针方法

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 *)。

嗯.. 我该怎么办?

【问题讨论】:

  • 不可能将成员函数指针转换为非成员函数指针。你真正想在这里做什么?可能有更好的方法来做你想做的事。
  • AnotherClass 看起来设计得很糟糕,因为它只需要一个函数指针,没有属于调用者的上下文。您的调用者显然想提供一些上下文(在 Myclass 的特定实例上调用非静态成员函数 MyMethod 时,您需要 this 指向的东西)。 C 风格的回调接口通常有一个用户数据指针,在 C++ 中你可以这样做,或者使用多态。根据 dll 边界的重要性,您或许可以将 addParams 设为模板。

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


【解决方案1】:

你不能。

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

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

没有办法让两者兼容。

【讨论】:

    【解决方案2】:

    编辑:我稍微误读了您的问题,并没有注意到有关 DLL 的内容 - 但是如果您可以控制 DLL 并希望修改它,那么第 1 和第 3 仍然适用.如果没有,你能做的只有第二个。


    在这种情况下,您可以做三件事:

    一,通过像这样声明addParams 来改变AnotherClass 的设计方式:

    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*)>);
    };
    

    【讨论】:

      【解决方案3】:

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

      你可以从这里调用方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-03
        • 2012-11-21
        • 2021-09-20
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        相关资源
        最近更新 更多