2017-07-19 129 views
2

這是我的模型代碼單例:C++單例模式的代碼無法運行,我不知道爲什麼

#include <iostream> 
using namespace std; 
class CSingleton 
{ 
private: 
    CSingleton() 
    { 
    } 
    static CSingleton *m_pInstance; 
public: 
    static CSingleton * GetInstance() 
    { 
     if(m_pInstance == NULL) 
      m_pInstance = new CSingleton(); 
     return m_pInstance; 
    } 
}; 
int main() { 
    CSingleton* p1 = CSingleton::GetInstance(); 
    return 0; 
} 

當我運行這段代碼,以下錯誤衝擊片雷管undefined reference to CSingleton::m_pInstance,我不知道知道我錯在哪裏,我只想寫一個單一的模型。有人可以幫我嗎?

+1

您已聲明'm_pInstance',但尚未定義它。在任何函數或類定義之外的文件級別添加此行:'CSingleton * CSingleton :: m_pInstance = nullptr;' –

+1

這是2017年,人們仍然使用* singleton !!!!! * – army007

+4

@ army007,它是2017和人仍然使用* COBOL * :-)儘管*被標記爲基於某些人的反模式,但它仍然有用。從這個意義上講,它與「goto」在同一條船上,來自函數和副作用的多個返回點,所有這些都可能被濫用,但在某些情況下是相當不錯的。 – paxdiablo

回答

2

外班的(和main外),你需要定義變量之上只是聲明它(在你的類):

CSingleton *CSingleton::m_pInstance = nullptr; 

你也預告我使用了nullptr而不是NULL0 - 這是在現代C++編譯器中執行空指針的更好方法。


下完整的程序演示如何做到這一點:

include <iostream> 

class CSingleton { 
    private: 
     static CSingleton *m_pInstance; 
     CSingleton() { 
      std::cout << "Instantiating\n"; 
     } 
    public: 
     static CSingleton *GetInstance() { 
      if (m_pInstance == nullptr) { 
       m_pInstance = new CSingleton(); 
      } 
      std::cout << "Delivering\n"; 
      return m_pInstance; 
     } 
}; 
CSingleton *CSingleton::m_pInstance = nullptr; 

int main() { 
    CSingleton* p1 = CSingleton::GetInstance(); 
    CSingleton* p2 = CSingleton::GetInstance(); 
    CSingleton* p3 = CSingleton::GetInstance(); 
    return 0; 
} 

正如預期的那樣,它輸出:

Instantiating 
Delivering 
Delivering 
Delivering 
+0

這是我第一次嘗試使用單身模式,有一個非常愚蠢的。謝謝 – guanjun

2

如果你真的想用單,用邁耶斯之一:

class CSingleton 
{ 
private: 
    CSingleton() = default; 
    CSingleton(const CSingleton&) = delete; 
    CSingleton& operator=(const CSingleton&) = delete; 
public: 
    static CSingleton& GetInstance() 
    { 
     static CSingleton instance; 
     return instance; 
    } 
}; 
0

您需要t o 初始化單例類的靜態數據成員。它可以在類的外部做作爲如下─

CSingleton *CSingleton::m_pInstance = nullptr; 

是的,如果你真的想用辛格爾頓最好的版本,你應該使用Meyer的版本由的建議@ Jarod42。因爲這是線程安全的,並且這是低延遲系統的首選設計。

相關問題