2012-05-15 1 views
0

C++에서 Unity3d에있는 것과 비슷한 "구성 요소 관리자"클래스를 만들려고합니다. 내가 원하는 것은 BaseComponent라고하는 클래스의 파생 된 유형을 보유 할 수있는 컨테이너 클래스입니다. 단결, 하나의 내가 C에서 동일한 인터페이스를 ++ 싶습니다() 타입 DerivedComponentType &형식 안전 C++ "구성 요소 관리자"템플릿 만들기

입니다 반환하는

manager.GetComponent을 통해 형태 보증 된 방법으로 제네릭을 사용하여 구성 요소에 대해 요청할 수 있습니다. AddComponent 함수를 통해 구성 요소를 추가하면 모든 프로세스가 사용 관점에서 유형 안전성이 보장됩니다.

저는 문자열로 식별하는 것을 피하기 위해 여기에서 노력하고 있습니다. 파생 된 모든 유형에 동일한 이름의 정적 멤버 함수를 제공하고 그 주소를 클래스 인스턴스에 대한 맵 인덱스로 사용하여이 작업을 수행 할 수도 있음을 알고 있습니다. 구성 요소 관리자의 사용자가 자신의 구성 요소를 파생하도록 선택해야이 함수가 있는지 확인하지 않아도되도록이 작업을 수행하지 않을 것입니다.

감사합니다.

+0

아마도 이것이 어떻게 사용되는지에 대한 간단한 설명으로 우리를 계몽 할 수 있습니까? 원하는 인터페이스를 사용하는 가상의 코드를 보여줍니다. 계층 구조에 대해 이야기하고 있기 때문에 최소한 두 가지 유형을 사용해야합니다. –

+0

DerivedComponentType의 인스턴스 인 첫 번째 구성 요소를 반환합니까? –

답변

1

당신이 할 수있는 한 가지 방법은 dynamic_cast입니다.

template <typename Derived> 
Derived* GetComponent (void) 
{ 
    // componentlist is a std::vector<BaseClass*> 
    for (unsigned i = 0; i < componentlist.size(); ++i) 
    { 
    Derived* val = dynamic_cast<Derived*>(componentlist[i]); 
    if (val != 0) 
     return val; 
    } 
    return 0; 
} 

형식이 템플릿에 지정된 형식과 일치하지 않으면 dynamic_cast는 null 포인터를 제공합니다. 물론 이는 런타임에 수행해야하는 작업입니다. 최신 기계에서는 너무 자주하지 않는 한 큰 타격을주지 않을 것입니다. 훨씬 더 많이 참여할 수있는 몇 가지 다른 방법이 있습니다.

또한이 같은 가질 수 있도록 입력 한 정보를 찾을 수있는 빠른 방법을 제공하는 반사 시스템 작성에 볼 수 있었다

:

Derived* GetComponent (MetaData *TypeIWant) 
{ 
    if (componentlist[i]->Type() == TypeIWant) 
    //... 
} 

이것은 장기적으로 훨씬 더 많은 작업이 될 것, 그리고 당신의 부분에 대해 약간의 연구를해야 할 것입니다. 그러나 아마도 내가 알고있는 유일한 C++ 옵션은 string lookup과 "겁나는"dynamic_cast를 필요로하지 않기 때문에 많은 사람들이 싫어하는 경향이 있습니다.