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 に答える