创建我的Game类的静态单例会引发链接器错误2001?

时间:2012-08-09 13:53:27

标签: c++ static singleton linker-errors

链接器错误消息“private:static class 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 Callbacks需要调用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()

2 个答案:

答案 0 :(得分:2)

static Worlds::Game* instance; - 从标头中删除此内容。由于instance标记为static,因此会按照每个翻译单元进行复制。并且您获得与翻译单元一样多的实例。但是,您只能在一个翻译单元中初始化它

还考虑以这种方式实施singleton

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

答案 1 :(得分:1)

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

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

但是,在类体外部使用时,在代码文件的根空间中,含义为已更改。在这种情况下,使用普通的旧C含义:标记为'static'的符号被隐藏,不被其他模块链接。

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

从根代码范围中删除“static”,它会没问题。