2011-08-01 23 views
3

MyClass是一个单例类(在我的整个程序中将只有这些类中的一个)。函数指针 - 模棱两可的符号错误

我想要做的事情如下。

  1. 使用AddData将数据添加到我的类中,获取返回的函数指针,然后可以将它传递给dll中的“另一个”函数。
  2. 那么这个“其他”函数调用我的回调函数

我的班级像这样。

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中定义的“回调”传递给一个dll函数,该函数将回调到我的回调函数中。

我有的DLL的代码,所以我想修改一个,如果它的功能,以便它接受我的回调函数参数。

我在DLL函数签名这样做:

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

但我得到的错误: 错误C2872: 'DataReceivedCallback':不明确的符号

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

+0

我不明白整个安装:你说你只想要一个*你* singleton类'MyClass'的实例,但你有这个过于复杂的方案,以返回一个指向它的成员函数。为什么?如果只有一个这样的实例和一个这样的类,为什么这种间接?为什么有一个函数'AddData' - 它没有添加任何东西! –

回答

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

应,

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

因为,MyCallBackFunctionMyClass一个非静态成员方法。所以它不能有正常的功能签名。 也改变分配,

callback = &MyClass::MyCallBackFunction; 

Demo

+0

事实上,它应该是一个'的std :: function'(或'的boost :: function'),如果你问我:) –

+0

对不起我的功能是静态的,我粘贴的cdoe错误。 – harry

+0

@harry,在这行你得到错误。否则我会看到你的代码很好:http://www.ideone.com/w1szD。什么是'GetInstance()'? – iammilind

2

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

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

另注:你不需要参照DLL函数传递函数指针,只需按值传递它们。它们只是指针,所以它们重量轻。

+0

他确实需要通过引用传递他的函数指针,因为他试图在函数体中分配给它们,并且大概他希望一旦该函数返回就可以看到该赋值。 (他当然可以通过值返回它,也许你的意思是这样呢?) –

+0

@Charles:更新,我说的是DLL函数的调用。我假设DLL将参与这个计划,只是调用函数。 –

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 
}