2013-04-04 120 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);