我有以下标题:
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是虚拟的,但你不能将静态方法设为虚拟。
答案 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)
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);