我想知道如何创建一个创建多个实例的类,即
Session o1 = new Session();
Session o2 = new Session();
然后,您可以将这些会话视为活动会话。
o1.makeActiveSession();
Session::setActiveSession(o2);
然后在我的代码中的任何一点我都可以去:
Session::getActiveSession();
它将返回活动会话对象或创建一个新对象(如果不存在)。任何时候只有一个会话可以是活动会话,因此如果会话被告知成为活动会话,则旧会话将被停用。
所以我的问题是,我将如何制作这样的东西?
答案 0 :(得分: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();
答案 1 :(得分: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实例Sessions,因为它可以跟踪生成的所有会话(跟踪留作读者的练习)。
您也可以将经理和会话合并到一个班级中,但我发现这种分离更容易理解。