1

我正在尝试实现我在书中找到的单例设计模式,我知道我可能不需要在这里使用单例,但除此之外我已经创建了一个 GamePropertiesManager 并且我得到了以下编译(或者更确切地说,链接器?)错误:Main.cpp|| undefined reference to GamePropertiesManager::GetInstance

我正在尝试在我的主要功能中使用我的单例,就像这样..

#include "GamePropertiesManager.hpp"

..

int main()
{
      GamePropertiesManager::Create();
      GamePropertiesManager::GetInstance()->test();
...
}

我的 GamePropertiesManager 在头文件中定义如下:

class GamePropertiesManager
{
   public:
      static GamePropertiesManager* GetInstance();
      static void Create();
      static void Destroy();

      void test();


   protected:
      GamePropertiesManager();
      static GamePropertiesManager* _instance;

      enum GameMode{ PLAYERVSPLAYER, PLAYERVSCOM };
      GameMode _gameMode;
      std::string _player1Name, _player2Name;
      int _player1Score, _player2Score;
      std::string _matchSurvivor;
      int _gameSpeed;

};

并在单独的 cpp 文件中声明:

#include "GamePropertiesManager.hpp"
//testic
#include <iostream>

GamePropertiesManager* GamePropertiesManager::_instance = NULL;

void GamePropertiesManager::Create()
{
   if (!_instance) //instance not yet created
      _instance = new GamePropertiesManager();
}

void GamePropertiesManager::Destroy()
{
   delete _instance;
   _instance = 0;
}

GamePropertiesManager::GamePropertiesManager() :
   _gameMode(PLAYERVSCOM), _player1Name("Player 1"), _player2Name("Player 2"),
      _player1Score(0), _player2Score(0), _matchSurvivor("NONE"), _gameSpeed(1)
{

}

void GamePropertiesManager::test()
{
   std::cout << "test success!" << std::endl;
}

如果有人可以查看它并解释我做错了什么,我将非常感激!

4

5 回答 5

3

你已经声明了一个函数static GamePropertiesManager* GetInstance();但没有定义它。实际上,您GamePropertiesManager::Create()正在完成大部分工作。如果我是你,我会摆脱它并替换为:

GamePropertiesManager* GamePropertiesManager::GetInstance()
{
    if (!_instance) //instance not yet created
        _instance = new GamePropertiesManager();

    return _instance;
} 
于 2012-04-19T13:08:20.480 回答
1

正是它在锡上说的。您已经声明了该GetInstance函数并试图调用它,但您实际上并未定义该函数的实现。

于 2012-04-19T13:05:01.080 回答
1

我看到了 GetInstance() 的声明,但没有看到定义。也许你只是忘记写了?

于 2012-04-19T13:05:14.483 回答
1

您忘记定义 GetInstance()!

于 2012-04-19T13:07:26.947 回答
1

您必须实现静态函数 GetInstance()。

我会摆脱 _instance 并这样做:

GamePropertiesManager* GamePropertiesManager::GetInstance()
{
    static GamePropertiesManager manager;
    return &manager;
} 
于 2012-04-19T13:22:33.327 回答