0

我想知道您将如何创建一个创建多个实例的类,即

Session o1 = new Session();
Session o2 = new Session();

然后,您可以像这样使这些会话成为活动会话。

o1.makeActiveSession();
Session::setActiveSession(o2);

然后在我的代码中的任何时候我都可以去:

Session::getActiveSession();

如果不存在,它将返回活动会话对象或创建新对象。任何时候只有一个会话可以是活动会话,因此如果一个会话被告知成为活动会话,那么旧的会话将被停用。

所以我的问题是,我将如何制作这样的东西?

4

2 回答 2

3

这是基于延迟加载的单例:

class Session
{
public:
    static Session& getInstance() {
        static Session s;                   // <-- instantiated upon first call
        return s;
    }

private:
    Session() { }                           // <-- private constructor
    ~Session() { }
    Session(const Session&);                // <-- private copy constructor
    Session& operator=(const Session&);     // <-- private assignment operator
};

用作:

Session& s = Session::getInstance();
于 2013-10-06T21:30:24.680 回答
1

您应该能够采用大多数常见的 Singleton 实现,并将其修改为具有可用 CreateNew() 和 SetActive() 函数的管理器。

// Session.h
class ActiveSessionManager;
class Session
{
public:

protected:
  Session(){};

  void MakeActiveSession();

  friend class ActiveSessionManager;
};

// ActiveSessionManager.h
class ActiveSessionManager
{
public:
  static Session *GetActiveSession()
  {
    if ( s_active == nullptr )
    {
      s_active = new Session();
    }

    return s_active;
  }

  static void SetActiveSession( Session *session )
  {
    s_active = session; 
  }

  static Session *CreateNewSession()
  {
    return new Session();
  }

  static Session *CreateNewActiveSession()
  {
    s_active = CreateNewSession();
    return s_active;
  }

private:
  ActiveSessionManager(){};

  static Session *s_active;
};

// I would put these in cpps.
Session *ActiveSessionManager::s_active = nullptr;

void Session::MakeActiveSession()
{
  ActiveSessionManager::SetActiveSession( this );
}

在我的实现中,我只允许 ActiveSessionManager 实例化会话,因为它可以跟踪生成的所有会话(跟踪留给读者作为练习)。

您也可以将经理和会话合并到一个类中,但我发现分离更容易遵循。

于 2013-10-06T21:46:04.503 回答