【问题标题】:Creating a Static Singleton of my Game class throws a linker error 2001?创建我的游戏类的静态单例会引发链接器错误 2001?
【发布时间】:2012-08-09 13:53:27
【问题描述】:

链接器错误消息“私有:静态类 Worlds::Game * Worlds::Game::instance”
以下是与错误相关的代码段。

来自 Game.h

static Worlds::Game* instance;
static Worlds::Game* getInstance();

来自 Game.cpp

Worlds::Game* instance = 0;

Worlds::Game* Worlds::Game::getInstance()
{
    if (instance)
    {
        return instance;
    }
    else
    {
        return instance = new Worlds::Game();
    }
}

所以我的问题是为什么我会收到此错误,因为我应该涵盖所有基础以创建我的游戏类的单例?

编辑:

我忘了在 Game.cpp 中添加我的所有 Glut 回调,这些回调需要调用 Game 中的函数。

void onKeyDownCallback(unsigned char key, int mouseX, int mouseY)
void onKeyUpCallback(unsigned char key, int mouseX, int mouseY)
void timerCallback(int value)
void onWindowReshapeCallback(int w,int h)
void onMouseClickedCallback(int button, int state, int mouseX, int mouseY)
void onMouseMovedCallback(int deltaX, int deltaY)
void displayCallback()

【问题讨论】:

  • 请看我如何编辑您的帖子并学习使用正确的格式。使用 标签是没有意义的。只需缩进代码即可。

标签: c++ static singleton linker-errors


【解决方案1】:

static Worlds::Game* instance; - 从标题中删除它。因为instance 被标记为static,所以每个翻译单元都会复制它。你得到的实例与翻译的单位一样多。但是你只在一个翻译单元中初始化它

还可以考虑以这种方式实现singleton

Worlds::Game & Worlds::Game::getInstance()
{ 
    static Game instance;
    return instance;
}

【讨论】:

    【解决方案2】:

    在C++中static关键字有两种含义。

    在类中使用时,表示“静态变量”或“静态方法”,可以在没有对象实例的情况下调用。

    但是,当在类主体之外使用时,在代码文件的根空间,意思是改变了。在这种情况下,使用普通的旧 C 含义:标记为“静态”的符号被隐藏,无法被其他模块链接。

    这意味着,如果您像这样定义了 .h 文件,并且在多个 .cpp 模块中 #include 了该 .h 文件,那么 没有其他模块 会看到“实例”或“getInstance”实现。

    从根代码范围中删除“静态”就可以了。

    【讨论】:

    • 哈,两个是什么意思?为什么 C++ 会那么那么简单?它有三个的含义。 (另一个是指定静态局部变量)
    • 静态局部变量与类静态字段的含义相同。只是名称的可见性不同。实际上,正如 Andrew 指出的那样,含义是 ONE,它是关于翻译单元中的内存块保留。感知的差异仅基于标识符的可见性。
    • 我不会这么说,因为他们的生命周期不同。
    • IIRC,它们生命周期的差异(如果有的话,我现在真的不记得了),对于“用户代码”来说可以忽略不计,因为它们保证在之前被初始化/销毁/进入/退出 main() 之后。无论哪种方式,如果您尝试依赖特定静态初始化顺序的顺序,您只是在问问题..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2010-11-05
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多