2011-11-12 2 views
2

동일한 기본 클래스에서 파생 된 여러 클래스 형식을 단일 stl 목록에 저장하려고합니다. 그때단일 목록에 여러 파생 클래스 형식 저장

list<BaseClass> L; 

를 사용하는 경우 내가 어떤 파생 클래스를 추가 할 때

내 코드는 잘 컴파일합니다. 그러나, 파생 된 클래스는 저장되기 전에 기본 형식으로 자동으로 캐스팅됩니다. 분명히 파생 된 유형의 고유 멤버도 저장하려고합니다. 어떻게해야합니까?

+0

여러 개체를 의미하는 것 같습니다. – leo

답변

4

당신은

list<BaseClass *> L; 

하지만, 당신은 예외 안전성에 문제가있는 것을 사용해야합니다 . 그럼 아마도 :

#include <list> 
#include <tr1/memory> 

std::list<std::tr1::shared_ptr<BaseClass> > L; 

더 좋을 것입니다. TR1 기본 정보는 예를 들어 찾을 수 있습니다. 부스트 문서에 해당하는 의 documentation

+0

+1에'tr1' 표시 +1 –

+0

@KirilKirov 만약이 똑똑한 포인터가 C++ 11에 있다고 언급했다면 +1 일 뿐이며, 만약 당신이 필요하지 않다면'unique_ptr'을 사용할 수도 있습니다. 'shared_ptr'의 오버 헤드. 이 모든 것이 대답에 속하지는 않을 수도 있지만 사실 그는 똑똑한 지침으로 시작하는 사람이었습니다. –

+0

Christian Rau : 나는'shared_ptr' 오버 헤드를 알고 있습니다. 그러나 이제는 추가 라이브러리 (Boost) 또는 다른 표준 (C++ 11)이없는 유일한 솔루션입니다. –

1

당신은 list< Baseclass* >

또는 list< Baseclass& >으로 컨테이너를 작성해야합니다 (두 번째는 조금 위험하다). (@Cat Plus Plus의 의견 덕분에 "삭제되었습니다")

list<Baseclass>을 사용하면 slicing issue을 충족하게됩니다.

+1

참조를 지정할 수 없기 때문에 참조를 사용할 수 없습니다. –

+0

아, 맞아, 고마워! –

+0

aaaaaand -1? –

0

원하는대로하려면 포인터로 작업해야합니다. 가능한 해결책은 std::list<BaseClass*>이지만 지금은 복사, 복제, 삭제를 처리해야합니다. 더 나은 대안은 자동으로 수행하는 Boost.Pointer Containers을 사용하는 것입니다. (목록이 범위를 벗어나면 개체를 파괴합니까? 몇 가지 예외가 이전에 발생되는 경우는 어떻게?)