【问题标题】:Using Singleton in different classes在不同的类中使用 Singleton
【发布时间】:2011-04-01 19:14:33
【问题描述】:

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

例如:

//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) 的单个类标头时出现链接错误:“private: static class Singleton Singleton::_instance” (?_instance@Singleton@@0V1@A) 已在 Singleton 类中定义.obj

【问题讨论】:

    标签: c++ singleton


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      James 已经告诉您问题出在哪里:您需要将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;
        }
      };
      

      不过,这意味着延迟初始化。通常没关系,但有时您需要在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;}
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 2019-08-09
        • 1970-01-01
        相关资源
        最近更新 更多