1

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

4

1 回答 1

3

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

添加

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

在您的 PlayState.cpp 文件中

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

于 2013-10-01T17:34:27.983 回答