您应该能够采用大多数常见的 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 实例化会话,因为它可以跟踪生成的所有会话(跟踪留给读者作为练习)。
您也可以将经理和会话合并到一个类中,但我发现分离更容易遵循。