这是我在 StackExchange 上的第一个问题,如果需要更多信息,请告诉我。我会尽量做到完整和简洁。代码包含在下面。
我正在尝试实现此处找到的状态管理器:Managing Game States in C++
我已经下载了代码并逐字逐句复制了它(我更改了几个类和变量名)。代码一直编译,直到我在 main.cpp 中添加以下行:
game.ChangeState(PlayState::Instance());
这会导致以下链接器错误:
错误 LNK2001:未解析的外部符号“私有:静态类 PlayState PlayState::m_Instance”(?m_Instance@PlayState@@0V1@A)
主文件
#include "JewelEngine.h"
#include "PlayState.h"
int main(int argc, const char* argv[])
{
JewelEngine game;
game.Init();
game.ChangeState(PlayState::Instance());
while(game.Running())
{
game.HandleEvents();
game.Update();
game.Render();
}
game.Cleanup();
return 0;
}
播放状态.h
#ifndef PLAYSTATE_H
#define PLAYSTATE_H
#include "GameState.h"
class PlayState:public GameState
{
public:
void Init();
void Cleanup();
void HandleEvents(JewelEngine* game);
void Update(JewelEngine* game);
void Render(JewelEngine* game);
void Pause();
void Resume();
static PlayState* Instance()
{
return &m_Instance;
}
protected:
PlayState() { }
private:
static PlayState m_Instance;
};
#endif
游戏状态.h
#ifndef GAMESTATE_H
#define GAMESTATE_H
#include "JewelEngine.h"
class GameState
{
public:
virtual void Init() = 0;
virtual void Cleanup() = 0;
virtual void HandleEvents(JewelEngine* game) = 0;
virtual void Update(JewelEngine* game) = 0;
virtual void Render(JewelEngine* game) = 0;
virtual void Pause() = 0;
virtual void Resume() = 0;
void ChangeState(JewelEngine* game, GameState* state)
{
game->ChangeState(state);
}
protected:
GameState();
};
#endif
我尝试删除静态成员和函数,使构造函数公开,而是在 main 中声明 PlayState 对象,然后将其地址传递给 ChangeState 函数,但仍然会发生非常相似的链接错误。我已经无可救药地困在这个问题上两天了,非常感谢提供的任何帮助。谢谢你。