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

我需要 OnRequest 和 OnReceive 像通过 NonClassFunction() 的回调一样工作。NonClassFunction 被中断调用,所以这里有一些面向对象的修改。MyClass 旨在被继承。理想情况下,我希望 OnRequest 和 OnReceive 是虚拟的,但您不能将静态方法设为虚拟。

4

4 回答 4

1

这些是链接器错误,这意味着成员未定义 。它们只是被声明的。

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

.cpp文件中执行此操作:

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

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

注意*上述定义中的位置。像这样的一个小错误:

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

会完全改变意思!现在这些是指向非静态成员函数的指针。所以要知道区别并小心。:-)

于 2013-04-04T03:37:25.227 回答
1

标题中的这两个变量:

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

尚未定义。

在您的 cpp 文件中定义它们。

void (*MyClass::OnRequest)();
void (*MyClass::OnReceive)(int);
于 2013-04-04T03:37:52.557 回答
1

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

void (*MyClass::OnRequest)();
void (*MyClass::OnReceive)(int);
于 2013-04-04T03:38:34.660 回答
0

我最近问了同样的问题 how-to-send-a-message-to-the-class-that-c​​reated-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);
于 2013-04-04T03:40:19.467 回答