在不同的类中使用Singleton

时间:2010-08-20 17:52:52

标签: 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(){};
};

在尝试包含A类(LNK2005)的单个类头时出现链接错误:已在Singleton类中定义的“private:static class Singleton Singleton :: _ instance”(?_ instance @ Singleton @@ 0V1 @ A) .OBJ

2 个答案:

答案 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;}
};