2013-04-04 54 views
0

我有以下標題:類和空指針

class MyClass { 
private: 
    static void (*OnRequest)(); 
    static void (*OnReceive)(int numBytes); 

public: 
    MyClass(); 

    static void SetOnReceive(void (*function)(int)); 
    static void SetOnRequest(void (*function)(void));  

}; 

void NonClassFunction(); 

,並聲明如下:

#include "MyClass.h" 
MyClass::MyClass() { 
... 
} 

void MyClass::SetOnReceive(void (*function)(int)) { 
    OnReceive = function; 
} 

void MyClass::SetOnRequest(void (*function)(void)) { 
    OnRequest = function; 
} 

void NonClassFunction() { 
    MyClass::OnRequest(); 
} 

代碼編譯罰款,但我得到以下錯誤,當我鏈接:

未解析的符號MyClass :: OnReceive,首次引用./src/MyClass.obj
unsso LVED符號MyClass的:: OnRequest,在./src/MyClass.obj

我需要OnRequest和的onReceive第一參考功能類似於通過NonClassFunction回調()。 NonClassFunction被中斷調用,所以在這裏有一些面向對象的修改。 MyClass被設計爲被繼承。理想情況下,我希望OnRequest和OnReceive是虛擬的,但不能使靜態方法變爲虛擬。

+0

從comp.lang.C++ FAQ:http://www.parashift.com/c++- faq/link-errs-static-data-mems.html – jamesdlin 2013-04-04 03:38:13

回答

1

這些是鏈接器錯誤,這意味着成員是而不是定義爲。他們只有宣稱

指針成員是static成員,所以他們需要定義,它在類之外。

.cpp文件操作:

void (*MyClass::OnRequest)(); 
void (*MyClass::OnReceive)(int); 

這些定義,你已經寫在全班只有聲明。

請注意上述定義中*的位置。像這樣的一個小錯誤:

void (MyClass::*OnRequest)(); //notice the difference 
void (MyClass::*OnReceive)(int); //notice the difference 

會完全改變意思!現在這些是指針指向非靜態成員函數。所以知道區別並小心。 :-)

+1

謝謝。我嘗試了一些更接近你說的不做void MyClass ::(* OnRequest)();它不會編譯。我嘗試了你所說的做法,並且完美運作。再次感謝。 – zam664 2013-04-04 03:50:27

1

在你的頭這兩個變量:

static void (*OnRequest)(); 
static void (*OnReceive)(int numBytes); 

尚未確定。

在您的cpp文件中定義它們。

void (*MyClass::OnRequest)(); 
void (*MyClass::OnReceive)(int); 
1

您提供了函數指針的聲明,但沒有提供定義。這種加入一個CPP文件:

void (*MyClass::OnRequest)(); 
void (*MyClass::OnReceive)(int); 
0

我問同樣的問題最近 how-to-send-a-message-to-the-class-that-created-the-object

enemies_array[0].enemy = new Enemy(this,&Game::EnemyEvent); 

typedef void (Game::*ChangeFunc)(DWORD &) 
Class Enemy 
{ 
private: 
    ChangeFunc iChange; 
    Game *pGame; 
}: 

Enemy(Game *pCreatorGame, ChangeFunc iChangeHandler) 
{ 
    iChange = iChangeHandler; 
    pGame = pCreatorGame; 
} 

void Enemy::Draw(D3DGraphics& gfx) 
{ 
    (pGame->*iChange)(this->dwThreadID);