2013-04-12 3 views
0

std::vector에 파생 클래스 cDerivedClass에 대한 공유 포인터를 보유하고 있으며 기본 클래스에 대한 포인터도 공유했습니다. 그래서 이런 식으로 뭔가 :파생 클래스의 벡터에 기본 클래스를 추가하는 방법

typedef SHARED_PTR<cBaseClass> cBaseClassPtr; 

typedef SHARED_PTR<cDerivedClass> cDerivedClassPtr; 

std::vector<cDerivedClassPtr> vDerivedPtrList; 

지금은, 유형 cBaseClassPtr의 인수를 받아 벡터 파생 클래스의 (vDerivedPtrList)에 추가하는 CDerivedClass::AddComponent(cBaseClassPtr inpBaseClass) 방법을 갖고 싶어 내가이 일에 대해 어떻게 갈 것인지?

나는 기본 클래스 다형성하지 않는 한베이스 - 파생 변환 동적 캐스트 허용되지 않기 때문에 dynamic_cast는 작동하지 않습니다 알고있다. 나는 cDerivedClassPtr에 cBaseClassPtr 캐스팅 정적 시도했다, 그러나 나는 오류가 발생하고 있습니다.

void cDerivedClass::AddComponent(cBaseClassPtr inpBaseClass) 
{ 
    MY_ASSERT(inpBaseClass, "Component cannot be NULL"); 

    cDerivedClassPtr pDerviedPtrToAdd = static_cast<cDerivedClassPtr>(inpBaseClass); 

    this->mvComponentList.push_back(pDerviedPtrToAdd); 
} 

편집 : 되려면 정확한 이것은 내가지고있어 오류입니다 :

No matching conversion of static_cast from 'cBaseClassPtr' (aka 'shared_ptr<cBaseClassPtr>') to 'cDerivedClassPtr' (aka 'shared_ptr<cDerivedClassPtr>'); 

내가 스마트 포인터 boost::shared_ptr의 부스트의 구현을 사용하고

+2

왜 그렇게하고 싶습니까? 기본 클래스에서 파생 클래스로 변환하는 것은 아무런 문제가되지 않습니다. 기본 클래스가 파생 클래스라는 것을 알지 못한다면 잘못된 디자인을 가리킬 수 있습니다. –

+4

개인적으로 여기에 디자인 결함이 있습니다. –

답변

0

당신의 CDerivedClass::AddComponent 기능은 정말 처리 할 수있는 경우 cDerivedClassPtr을 입력하고 그에 따라 서명을 조정하십시오.

CDerivedClass::AddComponent(cDerivedClassPtr inpDerivedClass) 
cBaseClassPtr의를 개최 한 후, cBaseClassPtr 처리 vDerivedPtrList의 정의를 조정할 수 있어야하는 경우

:

std::vector<cBaseClassPtr> vBasePtrList; 
0

당신이 여기서 뭘하려고 정확히 알고 어렵다, 어떤 스마트 포인터 구현 당신에게 사용하고 있습니다.

왜 기본 클래스 다형성하지? 만약 당신이 어떤 종류의 이중 발송물을 사용하여 적절한 컬렉션에 자신을 추가 할 수 있습니다. 각각의 유도를위한 다른 벡터가있는 경우

, 각 파생 클래스는 그것 자체를 추가하도록되어있는 한 알 것입니다.

enable_shared_From_this에서 파생하려면 기본 클래스가 필요합니다. 공유 포인터가 이미 현재 shared_ptred 인 경우 (아마도 그럴 것입니다) : shared_ptr 자체를 기본 유형으로 변경하면 다른 shared_ptr을 만들 수 있지만 첫 번째의 삶에 그 컬렉션에 넣어.

(부스트를 사용 중이며 std가 동일한 인터페이스를 가지고 있다고 가정 함)

관련 문제