类和void指针

时间:2013-04-04 03:33:53

标签: c++ void-pointers

我有以下标题:

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中引用   未解析的符号MyClass :: OnRequest,首先在./src/MyClass.obj中引用

我需要OnRequest和OnReceive来通过NonClassFunction()进行回调。 NonClassFunction正被一个中断调用,所以这里有一些面向对象的重整。 MyClass旨在继承。理想情况下,我希望OnRequest和OnReceive是虚拟的,但你不能将静态方法设为虚拟。

4 个答案:

答案 0 :(得分:1)

这些是链接器错误,这意味着成员 已定义。他们只是宣布

指针成员是static成员,所以他们需要定义,这是在类之外。

.cpp文件中执行此操作:

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

这些是定义,你在课堂上写的只是声明。

请注意上述定义中*的位置。一个轻微的错误,如:

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

会彻底改变意思!现在这些是指针到非静态成员函数。所以要知道差异并要小心。 : - )

答案 1 :(得分:1)

标题中的这两个变量:

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

尚未定义。

在cpp文件中定义它们。

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

答案 2 :(得分:1)

您提供了函数指针的声明,但没有提供定义。将其添加到单个cpp文件中:

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

答案 3 :(得分: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);