oop — парадигма C ++ Singleton / Active Object

Мне было интересно, как вы создадите класс, в котором вы создадите несколько экземпляров, т.е.

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

Затем вы можете сделать эти сеансы активным сеансом следующим образом.

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

Тогда в любой момент моего кода я мог перейти:

Session::getActiveSession();

и он вернет активный объект сеанса или создаст новый, если он не существует. Только один сеанс может быть активным сеансом в любое время, поэтому, если сеансу говорят, что он становится активным сеансом, то старый сеанс деактивируется.

Итак, мой вопрос, как бы я сделал что-то подобное?

0

Решение

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

Вы также можете объединить менеджер и сессию в один класс, но я считаю, что за разделением легче следовать.

1

Другие решения

Это синглтон с отложенной загрузкой:

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();
3

По вопросам рекламы [email protected]