gpt4 book ai didi

c++ - 尝试在 C++ 中实现状态管理器时出现链接错误

转载 作者:行者123 更新时间:2023-11-30 02:52:15 25 4
gpt4 key购买 nike

这是我在 StackExchange 上的第一个问题,如果需要更多信息,请告诉我。我会尽量做到完整和简洁。代码包含在下面。

我正在尝试实现在此处找到的状态管理器:Managing Game States in C++

我已经下载了代码并逐字复制(我更改了几个类名和变量名)。代码编译直到我在 main.cpp 中添加以下行:

game.ChangeState(PlayState::Instance());

这会导致以下链接器错误:

error LNK2001: unresolved external symbol "private: static class PlayState PlayState::m_Instance" (?m_Instance@PlayState@@0V1@A)

主要.cpp

#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 函数,但仍然会发生非常类似的链接错误。我已经无可救药地解决了这个问题 2 天,非常感谢提供的任何帮助。谢谢。

最佳答案

您已经声明了静态变量 m_Instance,但您需要定义它。

添加

PlayState PlayState::m_Instance = PlayState(); // static variable definition follows the syntax:
// (type) (var name) = (default assignment);

在你的 PlayState.cpp 文件中

从技术上讲,您不需要在此处调用 PlayState(),因为会自动调用构造函数。刚刚添加完成。关键是静态变量需要在它们的翻译单元中定义。类/结构中的声明是不够的,因为您需要“创建”它们。

关于c++ - 尝试在 C++ 中实现状态管理器时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19122359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com