2017-04-24 3 views
1

현재 <int, Derived>의 여러지도를 기본 클래스의 벡터에 저장하려고합니다.기본 클래스의 벡터에 어린이의지도를 저장

예 :

그러나
std::map<int, Derived_1 *> map_1 = smth; 
std::map<int, Derived_2 *> map_2 = smth_else; 

std::vector<std::map<int, Base *>> list; 

list.push_back(map_1); 
list.push_back(map_2); 

, 나는 파생 된지도와 기본 클래스 사이에 변환이 없다는 오류가 컴파일 할 때.

이 문제를 해결하기위한 더 나은 (또는 간단히 작동하는) 방법이 있습니까? 미리 감사드립니다.

+0

이렇게하면'list [0]'이'std :: map '이더라도'list [0] [0] = new Derived_2; – molbdnilo

답변

3

아니요, std::map<int, Base*>std::map<int, Derived_1*>은 다른 유형이므로 직접 구현할 방법이 없습니다.

가장 직접적인 해결책은 std::map<int, Base*>을 모든 곳에서 사용하는 것입니다. 또 하나는 변환 기능을 만드는 것이지만 덜 우아하고 성능 저하가 발생할 것입니다.

또 다른 옵션으로는 더 제한적이지만 모든 포즈 유형을 저장하려면 std::variant (C++ 17을 사용하는 경우) 또는 boost::variant을 사용하는 것이 좋습니다. 상대방은 아마도 방문자를 처리해야 할 것입니다.

+0

여기에 바보 같은 질문을하고, 그렇지만 매번 파생 된 타입으로 캐스팅해야 할 것입니다. – SgtDroelf

+1

불행히도 예. 반대로 클래스 클래스를 사용하는 경우에는 파생 클래스가 기본 클래스의 특정 동작을 구현 (재정의)하기 때문에이 경우 기본의 가상 함수를 호출하기 만합니다. 이것은 [다형성] (http://www.cplusplus.com/doc/tutorial/polymorphism/)이라고합니다 (아마도 이미 알고있을 것입니다. 여기서 분명히 알 수 있습니다). – cbuchart

+0

반면에 파생 된 각 클래스에 다른 인터페이스가있는 경우 디자인을 검토하거나 변형을 사용하는 것이 좋습니다. – cbuchart