2011-10-06 2 views
3

새로운 C++ 프로그래머가 여기 있습니다.고유 클래스를 매핑하고 값에서 서브 클래스를 추출하는 C++

나는 다음 맵 정의가 :

typedef std::map<std::string, Option> MapType; 
MapType my_map 

옵션은 내가 만든 독특한 클래스입니다. 필자는 실제로 Option 클래스를 맵에 추가하지 않습니다. 대신 나는 항상 Option에서 상속받은 클래스를 추가하고있다. 예를 들어 int 변수를 저장하는 IntOption이라는 클래스가있다. 나는

my_map["a key here"] 

을 할 때 "추가"값을 반환하기 때문에

IntOption add; 
my_map.insert(std::pair<string, IntOption>("a key here", add)); 

이 잘 작동 :

지금 내가 수행하여 내지도에 IntOption를 추가 아무런 문제가 없습니다.

이제 모든 좋은 사람에게 내 질문은 반환 값에서 서브 클래스 변수를 어떻게 얻을 수 있습니까? 나는 다음과 같은

my_map["a key here"].getVariableA(); // this is in the base class Option. 

할 수 있지만 기본 클래스하지만 클래스 확장 옵션에 있지 않기 때문에 나는

my_map["a key here"].getIntVariable(); //this fails because it doesnt recognize the 

// 게터 할 수 없습니다.

이 문제를 어떻게 해결합니까?

나는 생각했다 typedef std :: map MapType;

구매 동적 캐스팅을 수행하는 방법이나지도에 클래스에 포인터를 추가하는 방법을 알 수 없습니다.

답변

2

설정 한 방식대로 작동하지 않습니다. 이 맵은 Option의 인스턴스 만 보유하고 있다고 가정하고 있으므로, Intoption 데이터를 보내려고하면 던져 버릴 것입니다. 옵션에 대한 포인터로 돌아 가야합니다.

typedef std::map<std::string, Option*> MapType; 

my_map["a key here"] = new IntOption(); 

IntOption *opt = dynamic_cast<IntOption*>(my_map["a key here"]); 

이제 메모리 관리를 처리하고 옵션이 언제 할당 해제되는지 결정해야합니다. std :: auto_ptr이 도움이 될 것입니다.

+2

지도에 auto_ptr을 저장할 수 없습니다 (CopyConstructible 요구 사항을 충족하지 않음). shared_ptr 또는 unique_ptr이 좋습니다. –

+0

여기에서 문제는 파생 된 Option 유형이 여러 개있는 경우 dynamic_cast가 실패하고 (null을 반환) 어떤 유형의 항목이 성공했는지 미리 알아야한다는 것입니다. – David

+0

@David 맞습니다. 나는 그것이 문제의 본질에 내재되어 있다고 생각한다. - 사용자는 int 나 문자열, 날짜 등의 옵션을 저장하려고 시도하고있다. 그것이 어떻게 사용되는지는 비즈니스 규칙입니다. –

관련 문제