2016-02-08 78 views
0

我試圖從Design Patterns 中獲得第一個基本單例示例,但這讓我難堪。對Singleton :: Singleton()的未定義引用()

此代碼與g++ -c Singleton.cpp完全編譯:

class Singleton { 
public: 
    static Singleton* Instance(); 
protected: 
    Singleton(); 
private: 
    static Singleton* _instance; 
}; 

Singleton* Singleton::_instance = 0; 

Singleton* Singleton::Instance() { 
    if (_instance == 0) { 
     _instance = new Singleton; 
    } 
    return _instance; 
} 

但是當我添加一個骨骼main()和編譯g++ Singleton.cpp我得到undefined reference to 'Singleton::Singleton()'

我錯過了什麼?

+0

你宣佈一個構造函數(你不需要),但忽略了他的定義。 –

+0

@DieterLücking_「你不需要」_這並不完全正確。至少它應該是「私人」的。 –

+0

@πάνταῥεῖ確定 - 該死的反模式 –

回答

4

你永遠不加入一個定義

Singleton(); 
這是 Singleton* Singleton::Instance()使用

_instance = new Singleton; 

通常應該像你,可以佈置一個單

class Singleton { 
public: 
    static Singleton* Instance() { static Singleton s; return &s; } 
    Singleton(const Singleton&) = delete; 
    void operator=(const Singleton&) = delete; 
private: 
    Singleton() = default; 
}; 
+0

很好的答案,我一定會使用該片段。但它偏離教科書示例有點遠,也許你可以添加一些關於使用默認構造函數的信息? – Daniel

+1

@Daniel'Singleton()= default;'基本上只是一個C++ 11編寫'Singleton(){}'的方法。如果強制編譯生成'Singleton(){}'; – NathanOliver

+0

謝謝,Nathan!那麼'= delete'是什麼意思?它是什麼語法糖? – Tim