2012-07-13 118 views
3

我意識到這已被討論了多少次,但我還沒有找到適合我的問題的解決方案。我剛剛在我的項目中實現了一個Meyer的單例類,但我想從中創建一個模板,以便我可以將它用作例如。模板化單例類 - 如何處理私人構造函數

class Game : public Singleton<Game> { /* stuff */ }

我有這樣定義的

template <typename T> 
class Singleton 
{ 
public: 
    static T& Instance(); 

private: 
    Singleton(); 
    //declare them to prevent copies 
    Singleton(Singleton const&); 
    void operator=(Singleton const&); 

};// END OF CLASS DEFINITION 


// METHODS' DEFINITIONS 

template<typename T> 
T& Singleton<T>::Instance() 
{ 
    static T _instance; 
    return _instance; 
} 

允許男星我的課是public會破壞單身的整個視野​​。

編輯 好了,我已經更新了我的Game類交好Singleton<Game>

class Game : public Singleton<Game> 
{ 
friend class Singleton<Game>; 
//... 
} 

但現在我有這樣的事情:

未定義參考「辛格爾頓<遊戲> :: Singleton()'

在功能Game::Game()這是空的

+0

你的問題到底是什麼?由於Singleton-ctor是私人的,該遊戲無法調用Singleton 的ctor? - >保護Singleton的ctor。還是說Game的玩家必須是公開的,以便Singleton :: instance可以構造遊戲對象? – MadScientist 2012-07-13 09:18:36

回答

2

允許ctor公開將破壞單身人士的整體視野。

不,不是真的。 Game應該有一個私人構造函數。 Singleton的構造函數是不相關的。 Singleton<Game>的一個實例不會幫助任何人獲得Game的另一個實例,這是您感興趣的內容。

無論如何,您可以聲明構造函數protected。或者,您可以保留構造函數private並接受模板參數。除此之外在C++ 03中不起作用。儘管如此,應該在C++ 11中工作。但有一個小竅門:

template <typename T> 
struct wrapper 
{ 
    typedef T type; 
}; 

template <typename T> 
class Singleton 
{ 
    friend class wrapper<T>::type; 

更新:Game應該交好Singleton<Game>,或至少Singleton<Game>::Instance,允許被稱爲它的構造。

+0

請看看我的更新。我已經嘗試了兩個朋友'Singleton '並使用受保護的構造函數,但現在我有一個編譯錯誤。 – Patryk 2012-07-13 09:39:06

+1

這是一個鏈接器錯誤。您需要定義構造函數,而不僅僅是聲明它。最簡單的方法是在類的內部將空體'{}'添加到構造函數聲明中。 – 2012-07-13 11:58:43

2

ctor Singleton() - > protected?

相關問題