2013-10-06 1 views
0

당신은 다음과 같이 이러한 세션을 활성 세션을 만들 수C++ 싱글 톤/난 당신이 여러 인스턴스를 생성하는 클래스를 만들 것 궁금 해서요 액티브 객체 패러다임

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

즉.

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

그런 다음 내 코드에서 어느 시점에 나는 갈 수 :

Session::getActiveSession(); 

과 활성 세션 객체를 반환하거나 존재하지 않는 경우 새로 만들 것입니다. 한 번에 하나의 세션 만 활성 세션이 될 수 있으므로 세션이 활성 세션이되도록 지시되면 이전 세션은 비활성화됩니다.

제 질문은 어떻게 이런 식으로 만들 수 있습니까?

+0

무엇이 질문입니까? – BartoszKP

+0

질문은 어떻게이 행동을하는 무언가를 만들 것입니까? 또는 무엇을 권하고 싶습니다. –

+0

그냥 전역 변수가 있고 그것에 할당하십시오. 더 중요한 이유는 * 왜 * 당신이이 행동을 원합니까? 더 좋은 방법이있을 수 있습니다. – GManNickG

답변

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 
}; 

는 사용 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 할 수 있습니다.

관리자와 세션을 하나의 클래스로 결합 할 수도 있지만 쉽게 구분할 수 있습니다.

+0

큰 도움을 주셔서 감사합니다 :) –

3

이 게으른 로딩을 기반으로 싱글 : 당신은 가장 일반적인 싱글 구현 중 하나를 취할 수, 그것은 관리자로 수정해야

Session& s = Session::getInstance(); 
+0

이것은 고전적인 싱글 톤이지만 op가 한 번에 1 개만 활성화되도록하고 싶지만 한 번에 여러 인스턴스를 만드는 것으로 생각합니다. – Kindread