2012-04-19 30 views
0

我試圖實現Singleton設計模式我在一本書中,我知道,我可能不需要在這裏使用Singleton但拋開我創建了一個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 2012-04-19 13:04:10

回答

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 2012-04-19 13:14:46

+2

請記住,此方法不是線程安全的;在讓多個線程鬆動之前,您必須確保至少調用它一次。或者更好的是,不要嘗試使用Singleton反模式;至少在C++中,它總是比它的價值更麻煩。 – 2012-04-19 13:22:07

+0

是的,整件事不是線程安全的,所以我不想讓它複雜化,但你是對的 - 我同意你對Singletons造成的痛苦的看法! – 2012-04-19 13:27:39

1

正是它在錫說。你已經聲明瞭GetInstance函數並試圖調用它,但是你還沒有真正定義函數的實現。

1

我看到的GetInstance的聲明(),而不是定義。也許你忘了寫它?

1

你忘了定義的GetInstance()!

1

您必須實現靜態函數的GetInstance()。

我會擺脫_instance的和不喜歡這樣寫道:

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