如何创建可以在其他类中使用的单例实例?
例如:
//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(){};
};
Run Code Online (Sandbox Code Playgroud)
尝试包含A类(LNK2005)的单个类头时出现链接错误:在Singleton Class.obj中已经定义的"private:static class Singleton Singleton :: _ instance"(?_ instance @ Singleton @@ 0V1 @ A)
您需要在其中一个源(.cpp)文件中定义实例变量,而不是在头文件中定义.
如果在头文件中定义了实例变量,那么当该头文件包含在多个源文件中时,它最终会多次定义(这就是错误所说的).
詹姆斯已经告诉你问题是什么:你需要将移动定义的的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;
}
};
Run Code Online (Sandbox Code Playgroud)
但这意味着延迟初始化.通常没关系,但有时您需要先对象进行初始化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;}
};
Run Code Online (Sandbox Code Playgroud)