【问题标题】:How to return same instance for every class initialization in C++?如何为 C++ 中的每个类初始化返回相同的实例?
【发布时间】:2011-01-30 20:45:17
【问题描述】:

我想创建一个只能有一个实例的类。如果我尝试创建该类的另一个实例,它将返回第一个实例。

【问题讨论】:

  • 它是为了练习......来自一本书

标签: c++ oop class instance


【解决方案1】:

我认为您正在 C++ 中搜索 Singleton pattern。这里是 implementation,这里是 linux tutorial,用于 C++ 中的单例模式

【讨论】:

  • 不是一个很好的实现。面对多个线程失败。
  • 每次使用单例模式时,都会有一只小猫死亡。
  • 每次 Jeff Atwood 使用单例模式,独角兽就会死去!
  • 另外,实例永远不会被破坏。这对某些用途没关系,对其他人则无法使用。我更喜欢破坏一切,只是为了确保它正常运行并具有可靠的行为。不破坏可以(在某些情况下)对行为没有相当大的影响——它实际上可以加速程序的退出。但是,这通常是个坏主意 (IMO)。
  • @David 我不精通 C++。我只是现在这种模式,并希望提供帮助并尝试从良好的参考资料中提供参考,并使用 linux 教程进行更新。你知道在 C++ 中处理多线程只是一场噩梦 :)
【解决方案2】:

我认为你想要的更接近MonoState,而不是 Singleton。

MonoState 的工作原理是让所有对象通过静态成员变量共享相同的状态。虽然实例不同,但它们返回的数据是相同的。这是一个简单的实现:

class MonoStateSession {
private:
  static int _SessionId;

public: 
  void SetSessionId(int newSessionId) {
    //Put threading checks/locks here
    _SessionId = newSessionId;
  }

  int GetSessionId() {
    return _SessionId;
  }
}

//Usage
MonoStateSession session1 = new MonoStateSession();
session1.SetSessionId(123);
MonoStateSession session2 = new MonoStateSession();
assert(session2.GetSessionId() == 123);

【讨论】:

    【解决方案3】:

    不......但你可以接近那个。例如,您可以创建一个类,其中每个实例只是同一个真实对象的克隆...例如:

    struct TheRealObject
    {
        std::string s;
    
        TheRealObject() { ... }
        void foo(int x) { ... }
        double bar(char y) { ... }
    
        static TheRealObject& getInstance()
        {
            static TheRealObject trb;
            return trb;
        }
    };
    
    struct MyObject
    {
        std::string& s;
    
        MyObject() : s(TheRealObject::getInstance().s) {}
    
        void foo(int x) { TheRealObject::getInstance().foo(x); }
        double bar(char y) { return TheRealObject::getInstance().bar(y); }
    };
    

    请注意,每个MyObject 实例仍将是一个不同的对象(例如,具有自己的地址),但它们将充当TheRealObject 唯一存在的实例的蹦床,用于方法和数据成员访问。

    你为什么要做这么奇怪的事情?可能您只是在寻找单身人士(如上面的TheRealObject)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多