2017-07-19 123 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。因为这是线程安全的,并且这是低延迟系统的首选设计。

相关问题