1

链接器错误消息“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 回调,它们需要调用 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()
4

2 回答 2

2

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

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

Worlds::Game & Worlds::Game::getInstance()
{ 
    static Game instance;
    return instance;
}
于 2012-08-09T13:58:25.750 回答
1

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

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

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

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

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

于 2012-08-09T13:58:48.403 回答