这是我的单例模型代码:
#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;
}
当我运行此代码时,出现以下错误apper undefined reference to CSingleton::m_pInstance
,我不知道我错在哪里,我只想写一个模型。有人帮我吗?
答案 0 :(得分:2)
在课堂之外(以及main
之外),你需要定义该变量而不仅仅是声明它(就像你的班级一样) :
CSingleton *CSingleton::m_pInstance = nullptr;
您还注意到我使用了nullptr
而不是NULL
或0
- 这是在现代C ++编译器中执行空指针的更好方法。< / p>
以下完整程序显示了如何执行此操作:
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
答案 1 :(得分:2)
如果您真的想使用单身,请使用Meyers&#39;之一:
class CSingleton
{
private:
CSingleton() = default;
CSingleton(const CSingleton&) = delete;
CSingleton& operator=(const CSingleton&) = delete;
public:
static CSingleton& GetInstance()
{
static CSingleton instance;
return instance;
}
};
答案 2 :(得分:0)
您需要初始化您的单例类的静态数据成员。这可以在课外进行,如下所示 -
CSingleton *CSingleton::m_pInstance = nullptr;
是的,如果你真的想使用最好的Singleton版本,你应该按照 @ Jarod42 的建议使用Meyer的版本。因为这是线程安全的,这是低延迟系统的首选设计。