2012-04-19 6 views
0

私は本で見つけたシングルトンのデザインパターンを実装しようとしていますが、私はここでシングルトンを使う必要はないかもしれないが、 GamePropertiesManagerと私は次のコンパイル(?というか、リンカ)エラー取得しています:Main.cpp|| undefined reference to GamePropertiesManager::GetInstanceシングルトンの実装と未定義の参照:: 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

です**静的GamePropertiesManagerの定義*でGetInstance()**? – DumbCoder

答えて

3

あなたは関数static GamePropertiesManager* GetInstance();を宣言しましたが、定義していません。実際には、GamePropertiesManager::Create()がほとんどの作業を行っています。私があなただったら、私はそれを取り除き、それに置き換えます:

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

    return _instance; 
} 
+1

私は通常、シングルトンをどのように実装しますか。 [http://www.infernodevelopment.com/singleton-c](http://www.infernodevelopment.com/singleton-c) – ssell

+2

このメソッドはスレッドセーフではないことに注意してください。複数のスレッドを解放する前に少なくとも1回呼び出す必要があります。あるいは、もっと良いことに、シングルトンのアンチパターンをまったく使用しようとしないでください。少なくともC + +では、それは常にそれが価値よりも多くのトラブルです。 –

+0

はい、すべてがスレッドセーフではないので、私はそれを複雑にしたくありませんでしたが、あなたは正しいです - そして私はシングルトンが引き起こす痛みについてあなたの意見を共有します! –

1

錫の上に正確に記載されています。 GetInstance関数を宣言し、呼び出しようとしていますが、関数の実装を実際に定義していません。

1

GetInstance()の宣言がありますが、定義はありません。多分あなたはそれを書くのを忘れていたでしょうか?

1

GetInstance()を定義するのを忘れてしまった!

1

静的関数GetInstance()を実装する必要があります。

私は_INSTANCEを取り除くだろうと、それは次のように実行します。

GamePropertiesManager* GamePropertiesManager::GetInstance() 
{ 
    static GamePropertiesManager manager; 
    return &manager; 
}