函数指针 - 模糊符号错误

时间:2011-08-01 12:25:41

标签: c++

MyClass是一个单例类(在我的整个程序中只会出现其中一个)。

我想做的是如下。

  1. 使用AddData向我的类添加数据,返回一个函数指针,然后我可以传递给dll中的“另一个”函数。
  2. 然后这个'其他'函数调用我的回调函数
  3. 我的课就是这样。

    typedef void (*DataReceivedCallback)(int, int);  
    
    class MyClass
    {
        MyClass();
        ~MyClass();
    
        void AddData(int sourceId, DataReceivedCallback &callback);
        static void MyCallBackFunction(int var1, int var2);
    };
    
    void MyClass::AddData(int sourceId, DataReceivedCallback &callback)
    {
        callback = &MyCallBackFunction;
    
    }
    void MyClass::MyCallBackFunction(int var1, int var2 )
    {
        //do something blah blah
    }
    

    我可以这样做:

    int main()
    {
         DataReceivedCallback callback;
         MyClass->GetInstance()->AddData(1, callback);
         callback(1,100);
    }
    

    当我单步执行此操作时,我发现我确实踏入了我想要的回调MyCallBackFunction:)

    我现在要做的是将main中定义的'callback'传递给将回调到我的回调函数的dll函数。

    我有dll的代码,所以我想修改一个函数,以便它接受我的回调函数参数。

    我在dll函数签名中这样做:

    void * someDllFunction( int var1, int var2, DataReceivedCallback& callback)
    {
       callback(2, 200);
    }
    

    但我收到错误: 错误C2872:'DataReceivedCallback':模糊符号

    我该如何解决这个问题? 这是否只允许跨越dll边界使用c样式参数?

3 个答案:

答案 0 :(得分:5)

typedef void (*DataReceivedCallback)(int, int);

应该是,

typedef void (MyClass::*DataReceivedCallback)(int, int);

因为MyCallBackFunctionMyClass的非静态成员方法。所以它不能有常规的功能签名。 同时将作业更改为,

callback = &MyClass::MyCallBackFunction;

Demo

答案 1 :(得分:2)

你的类型错了。 DataReceivedCallback,别名void(*)(int, int)函数指针,但&MyClass::MyCallBackFunction指向成员函数的指针(PTMF) 。这两者完全不相关且不兼容!

您不能将成员函数视为自由函数。

由于您只有一个类的实例(注意:“一个实例”,而不是“一个类”;您总是只有一个类),为什么还要使用成员函数呢?只需将函数设置为全局(在命名空间内),您就完成了。虽然也许我误解了你的要求。

另一个注意事项:您不需要通过引用DLL函数来传递函数指针,只需按值传递它们即可。它们只是指针,所以它们很轻。

答案 2 :(得分:0)

你缺少的是如何声明一个指向成员函数的指针以及如何通过该指针调用成员函数,下面是一个基于你的例子的工作示例:

class MyClass;
//standard way to declare a pointer to member function should be - className::*memberFunName(para list)
typedef void (MyClass::*DataReceivedCallback)(int, int);  

class MyClass
{
public:
    void AddData(int sourceId, DataReceivedCallback &callback);
    void MyCallBackFunction(int var1, int var2);
};


void MyClass::AddData(int sourceId, DataReceivedCallback &callback)
{
    callback = &MyClass::MyCallBackFunction;

}
void MyClass::MyCallBackFunction(int var1, int var2 )
{
    //do something blah blah
    int tem = var1 + var2; //tem = 3 here
}

int main()
{
    MyClass obj;
    DataReceivedCallback callback;
    obj.AddData(1, callback);
    (obj.*callback)(1,2); //standard way to call the member function via function pointer
}