如何创建可在其他类中使用的单例实例?
例如:
//Singleton_Class.h
#ifndef Singleton_Class
#define Singleton_Class
class Singleton
{
private:
static Singleton _instance;
Singleton() {}
~Singleton() {}
Singleton(const Singleton &);
Singleton & operator=(const Singleton &);
public:
static Singleton &getInstance(){return _instance;}
};
Singleton Singleton::_instance;
#endif
//Main.cpp
#include "Singleton_Class.h"
int main()
{
Singleton &s = Singleton::getInstance(); //Use the instance
}
//ClassA.cpp
#include "Singleton_Class.h"
class A
{
public:
A(){};
};
在尝试包含A类(LNK2005)的单个类头时出现链接错误:已在Singleton类中定义的“private:static class Singleton Singleton :: _ instance”(?_ instance @ Singleton @@ 0V1 @ A) .OBJ
答案 0 :(得分:7)
您需要在其中一个源(.cpp)文件中定义实例变量,而不是在头文件中定义。
如果在头文件中定义了实例变量,那么当该头文件包含在多个源文件中时,它最终会多次定义(这就是错误所说的内容)。
答案 1 :(得分:6)
James已经告诉你问题是什么:你需要将static
成员变量的 定义 移动到自己的.cpp
文件中。
如果您不想仅为变量添加.cpp
文件,可以将其设为static
函数的本地getInstance()
:
class Singleton
{
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton &);
Singleton & operator=(const Singleton &);
public:
static Singleton &getInstance()
{
static Singleton _instance;
return _instance;
}
};
这意味着延迟初始化。通常没关系,但有时您需要在main()
之前初始化对象。
如果您遇到这个问题,也许您可以将实例变量放入类模板中:
// Beware, brain-compiled code ahead!
template< typename S >
class SingletonBase
{
private:
friend class Singleton;
SingletonBase() {}
public:
static S instance;
};
template< typename S >
S SingletonBase<S>::instance;
class Singleton : private SingletonBase<Singleton>
{
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton &);
Singleton & operator=(const Singleton &);
public:
static Singleton &getInstance(){return instance;}
};