2011-08-01 48 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 
}