동일한 기본 클래스에서 파생 된 여러 클래스 형식을 단일 stl 목록에 저장하려고합니다. 그때단일 목록에 여러 파생 클래스 형식 저장
list<BaseClass> L;
를 사용하는 경우 내가 어떤 파생 클래스를 추가 할 때
내 코드는 잘 컴파일합니다. 그러나, 파생 된 클래스는 저장되기 전에 기본 형식으로 자동으로 캐스팅됩니다. 분명히 파생 된 유형의 고유 멤버도 저장하려고합니다. 어떻게해야합니까?
동일한 기본 클래스에서 파생 된 여러 클래스 형식을 단일 stl 목록에 저장하려고합니다. 그때단일 목록에 여러 파생 클래스 형식 저장
list<BaseClass> L;
를 사용하는 경우 내가 어떤 파생 클래스를 추가 할 때
내 코드는 잘 컴파일합니다. 그러나, 파생 된 클래스는 저장되기 전에 기본 형식으로 자동으로 캐스팅됩니다. 분명히 파생 된 유형의 고유 멤버도 저장하려고합니다. 어떻게해야합니까?
당신은
list<BaseClass *> L;
하지만, 당신은 예외 안전성에 문제가있는 것을 사용해야합니다 . 그럼 아마도 :
#include <list>
#include <tr1/memory>
std::list<std::tr1::shared_ptr<BaseClass> > L;
더 좋을 것입니다. TR1 기본 정보는 예를 들어 찾을 수 있습니다. 부스트 문서에 해당하는 의 documentation
+1에'tr1' 표시 +1 –
@KirilKirov 만약이 똑똑한 포인터가 C++ 11에 있다고 언급했다면 +1 일 뿐이며, 만약 당신이 필요하지 않다면'unique_ptr'을 사용할 수도 있습니다. 'shared_ptr'의 오버 헤드. 이 모든 것이 대답에 속하지는 않을 수도 있지만 사실 그는 똑똑한 지침으로 시작하는 사람이었습니다. –
Christian Rau : 나는'shared_ptr' 오버 헤드를 알고 있습니다. 그러나 이제는 추가 라이브러리 (Boost) 또는 다른 표준 (C++ 11)이없는 유일한 솔루션입니다. –
당신은 list< Baseclass* >
또는
(@Cat Plus Plus의 의견 덕분에 "삭제되었습니다")list< Baseclass& >
으로 컨테이너를 작성해야합니다 (두 번째는 조금 위험하다).
list<Baseclass>
을 사용하면 slicing issue을 충족하게됩니다.
참조를 지정할 수 없기 때문에 참조를 사용할 수 없습니다. –
아, 맞아, 고마워! –
aaaaaand -1? –
원하는대로하려면 포인터로 작업해야합니다. 가능한 해결책은 std::list<BaseClass*>
이지만 지금은 복사, 복제, 삭제를 처리해야합니다. 더 나은 대안은 자동으로 수행하는 Boost.Pointer Containers을 사용하는 것입니다. (목록이 범위를 벗어나면 개체를 파괴합니까? 몇 가지 예외가 이전에 발생되는 경우는 어떻게?)
여러 개체를 의미하는 것 같습니다. – leo