2011-12-27 2 views
0

맞습니다. 저는 C++을 처음 접했으므로 여기서도 배우고 있습니다. 만약 내가 잘못된 방향으로 가고 싶다면 나에게 말해줘. 가능한 한 올바른 길을 가르쳐 주라. (튜토리얼에 대한 링크가있는 perhpap).지도 내에서 파생 된 객체를 저장하는 C++

나는 std :: map을 가지고 놀고 있으며 객체 (항목)를 저장하는 데 사용 해왔다. 이것은 잘 작동합니다. 문제는 파생 된 항목을지도에 저장하려고하는 것입니다. 나는 그것을 작동 시키지만 파생 된 객체를 분할하는 것으로 보인다.

항목에는 속성 a, b 및 c가 있습니다. 음식은 여분의 속성 d와 e가있는 항목에서 파생됩니다. 항목의지도에 저장 될 때 d 및 e에 액세스 할 수 없습니다. 컴파일러는 말한다 :

:

"오류 '클래스 항목이'D '라는 이름의 멤버가 없다"는 표준 : 맵 polymorphicaly를 사용 가능 또는 내가 부스트와 같은 다른 라이브러리를 사용해야합니까? 부스트는 다소 복잡한 것처럼 보입니다. 나는 여전히 배우는 동안지도로 그것을 할 수있는 방법이 있기를 바랬습니다. 내가 의미하는 바를 명확하게하기 위해 내가 놀고있는 코드가 있습니다.

Item * item = new Item (a, b, c); 
itemmap [vnum] = item; 
DerivedItem * deriveditem = new DerivedItem (a, b, c, d, e); 
itemmap [vnum] = deriveditem; 

이 작동하지만 파생 상품의 개발에 액세스하고 전자 수 없습니다

typedef std::map <int, tItem*> itemMap; 

상황이 이런 식으로 추가됩니다 항목의

지도는 이렇게 선언한다. 도움말 사람

+2

이 모든 것이 심각한 메모리 누출 악몽이 될 것입니다. 대신 스마트 포인터를 사용해야합니다. –

+0

지도에있는 항목은 프로그램을 종료 할 때까지 제거되지 않으므로 메모리 누출이 있어서는 안됩니다. – DizzyDuke

답변

3

에 대한

덕분에 당신은 당신이 무엇 클래스 knwo 경우 파생 된 클래스로 다시 캐스팅 dynamic_cast를 사용할 수 있습니다.

http://en.wikipedia.org/wiki/Dynamic_cast

당신이 원하는 경우

dynamic_cast<DerivedItem*>(itemmap[vnum])->derivedFunction(); 

당신이 [] 운영자가 템플릿 인수를 가지고 표준 : :지도에서 새 템플릿 클래스를 유도 할 수있다, 자동으로 수행합니다.

itemmap<DerivedItem>[vnum]->derivedFunction() 
+1

이 경우 함수와 컨테이너는 _values_가 아닌 _pointers_를 전달/보유해야 함을 언급해야합니다. –

+0

이것은 내가 원했던 대답이 아니지만 올바른 방향으로 나를 가리켰다. 감사! – DizzyDuke

0

당신은 Item 포인터로 DerivedItem 클래스에 특정 멤버에 액세스 할 수 없습니다 :하지만이 경우에 당신은 당신이 항목을받을 때 유형을 통과해야합니다.

val = static_cast<DerivedItem*>(itemmap[vnum])->d; 

을 ....하지만 맵의 유형있는 항목을 알고에 따라 달라집니다 : 당신은 그것을 캐스팅 할 수있다.

다형성 동작의 경우 대개 다른 방식으로 동작하는 파생 클래스에서 부모 클래스의 메서드를 재정의합니다.

+0

왜 알레산드로의 대답을 복제 했습니까? 의도적 인 경우 SO가 잘못 작동 함 – Ulterior

+1

@ 앞면 - 이것은 중복되지 않습니다.(a) 첫 번째 문장과 마지막 문장의 설명과 조언이 다른 대답에 나타나지 않았다. (b) 코드의 내용이 조금 다르다. (c) OP의 오해는 많은 방법으로 만 설명 될 수있다. . 그래서 잘하고있다. 나는 다른 대답이 나타 났을 때 이것을 타이핑하고 있었고, 그 차이가 여기에 남겨 둘 충분한 이유라고 생각했습니다. – sje397

+0

'static_cast'보다는'dynamic_cast'를 권합니다. –

관련 문제