在不同的类中使用Singleton

cpx*_*cpx 2 c++ singleton

如何创建可以在其他类中使用的单例实例?

例如:

//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)

Jam*_*lis 7

您需要在其中一个源(.cpp)文件中定义实例变量,而不是在头文件中定义.

如果在头文件中定义了实例变量,那么当该头文件包含在多个源文件中时,它最终会多次定义(这就是错误所说的).


sbi*_*sbi 6

詹姆斯已经告诉你问题是什么:你需要将移动定义的的static成员变量到它自己的.cpp文件.

如果您不想.cpp仅为变量创建文件,可以将其设置staticgetInstance()函数的本地文件:

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)