2017-11-19 16 views
0

데이터를 유지하고 해당 데이터에 액세스하는 메서드 인 GameInfoList를 제공하는 클래스가 있습니다. A, B, C의 3 가지 인터페이스를 기반으로 데이터가 생성됩니다. 특정 데이터를 가져 오는 데 2 ​​개의 인터페이스가 있습니다. D, EOOP - 클래스간에 데이터 공유

GameInfoList를 두 클래스간에 공유해야합니다. 내 접근 방식은 다음과 같습니다.

//fills GameInfoList based on interfaces called by the different clients. 
class GameInfo: public A, public B, public C 
{ 
public: 
    GameInfo(GameInfoList&) 
    //A,B,C impl 
private: 
    GameInfoList& gameInfoList; 
}; 

//reads GameInfoList and allow to get a particular info. 
class GameInfoProvider: public D, public E 
{ 
public: 
    GameInfoProvider(const GameInfoProvider&) 
    //D,E impl 
private: 
    const GameInfoList& gameInfoList; 
}; 

위의 시나리오를 나타내는 디자인 패턴이 있습니까? 내 접근 방식에 대해 어떻게 생각하십니까? 라이프 사이클이 분명하다 있도록

편집 GameInfoList, GameInfo 및 GameInfoProvider 객체는 "구성 요소"클래스에 존재합니다. 구성 요소 간의 통신은 절약에 기반을 둡니다.

답변

1

이것은 제어 패턴의 반전입니다. C++에서이 문제는 GameInfoList에 명확한 소유권이 없다는 것입니다.

코드가 잘 정리되어 있다면 문제가되지 않을 수도 있습니다. 그러나 코드에 -oh 이상의 프로그래머가있는 경우 공유 소유권이 암시되고 GameInfoList의 수명주기가 GameInfo 및 GameInfoProvider 둘 모두의 제어 범위를 벗어나기 때문에 조금 취약합니다.

"누구나 GameInfoList를 소유하고 있습니까?" 문제가 있다면 std::shared_ptr<GameInfoList>을 사용하면 GameInfoList의 소유권이 매우 명확합니다.

//fills GameInfoList based on interfaces called by the different clients. 
class GameInfo: public A, public B, public C 
{ 
public: 
    GameInfo(std::shared_ptr<GameInfoList>) 
    //A,B,C impl 
private: 
    std::shared_ptr<GameInfoList> gameInfoList; 
}; 

//reads GameInfoList and allow to get a particular info. 
class GameInfoProvider: public D, public E 
{ 
public: 
    GameInfoProvider(std::shared_ptr<GameInfoList>) 
    //D,E impl 
private: 
    std::shared_ptr<GameInfoList> gameInfoList; 
}; 

GameInfoProvider는 GameInfoList 사용의 제약을 잃었습니다. 그것은 내가 가진 것처럼 공유 된 소유권을 표현하려는 불행한 사상자입니다.

std::shared_ptr<const GameInfoList>을 사용하는 경우 GameInfoList는 불변 값 개체로 취급되지만 GameInfo에서도 이와 같이 표현해야합니다.

C++에는 인스턴스 개체에 참조 멤버 변수가 있다는 단점이 있습니다. std :: shared_ptr도 도움이됩니다.

+0

편집 – Irbis

+0

을 참조하십시오. 첫 번째 질문은 제어 역전입니다. 귀하의 두 번째 질문 : 괜찮아, 난 C + + 11'표준 : : shared_ptr' 대신 참조 회원 변수를 사용할 줄이야. – Eljay