Мне было интересно, как вы создадите класс, в котором вы создадите несколько экземпляров, т.е.
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 только создавать экземпляры Sessions, поскольку тогда он сможет отслеживать все сгенерированные сеансы (отслеживание оставлено в качестве упражнения для читателя).
Вы также можете объединить менеджер и сессию в один класс, но я считаю, что за разделением легче следовать.
Это синглтон с отложенной загрузкой:
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();