Мне было интересно, как вы создадите класс, где вы создадите несколько экземпляров, т.е.
Session o1 = new Session();
Session o2 = new Session();
Затем вы могли бы сделать эти сеансы активным сеансом.
o1.makeActiveSession();
Session::setActiveSession(o2);
Тогда в любой момент моего кода я мог бы пойти:
Session::getActiveSession();
и он будет возвращать активный объект сеанса или создавать новый, если он не существует. Только один сеанс может быть активным сеансом в любой момент времени, поэтому, если сеанс считается активным, тогда старый отключается.
Итак, мой вопрос: как мне сделать что-то подобное?
Вы должны иметь возможность использовать большинство общих реализаций 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 экземплярам Session, так как тогда он сможет отслеживать все сгенерированные сеансы (отслеживание остается как упражнение для читателя).
Вы могли бы объединить менеджера и сессию в один класс, но я считаю, что разделение легче следовать.
Это одинарный однопользовательский режим:
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();