C ++ : 'Basenode*'에서 'match*'로 무효 변환
-
19-08-2019 - |
문제
내 프로그램의 모든 객체는 컨테이너 클래스에서 상속됩니다. 컨테이너 클래스에는 a virtual BaseNode* getParent() const;
방법과 a virtual void setParent(BaseNode *p);
방법.
나는있다 Set
클래스 (데이터 구조가 아닌 테니스 경기에서 설정) Match
부모로서의 수업 (경고 setParent()
) 하지만 그때부터 Set
상속 Container
, 프로그램은 상단에서 트리 구조를 만듭니다. Set
수업은 어린이이며, 부모에 대한 정보를 추적하고 유지하는 방법이 필요하지 않습니다. Container
제공.
오류 C++: invalid conversion from ‘BaseNode*’ to ‘Match*’
프로그램을 컴파일하려고 할 때 아래의 방법에 나타납니다. (Player* getPlayer1() const;
만에만 존재합니다 Match
수업)
Player* Set::getPlayer1() const{
return getParent()->getPlayer1();
}
이것은 내 상속 구조입니다. (그 점에 유의하십시오 TreeNode
템플릿)
Match -> TreeNode<Set> -> BaseNode -> Container
왜 대화 오류가 발생했는지 이해가 안 돼요. 나는 내 교과서를 읽으려고했지만 다소 열악한 참조입니다. Google은 너무 많은 관련이없는 정보를 제공했습니다.
편집하다
Player* Set::getPlayer1() const{
return dynamic_cast<Match>(getParent())->getPlayer1();
}
원인
error: cannot dynamic_cast ‘#‘obj_type_ref’ not supported by dump_expr#<expression error>((&((const Set*)this)->Set::<anonymous>))’ (of type ‘class BaseNode*’) to type ‘class Match’ (target is not pointer or reference)
편집 2
방금 필요하다는 것을 깨달았습니다 dynamic_cast<Match*>
작동합니다.
해결책
문제는 그 것입니다 getParent()
반환 a BaseNode*
, 모든 유형의 포인터가 될 수 있습니다. BaseNode
- 그것은 또한 유래하는 관련없는 클래스를 가리킬 수 있습니다. BaseNode
. 부모가 유형이어야한다고 100% 확신하는 경우 Match
, 당신은 부모를 a로 캐스팅해야합니다 Match*
먼저 전화 할 수 있습니다 getPlayer()
그것에 :
Player* Set::getPlayer1() const{
return dynamic_cast<Match*>(getParent())->getPlayer1();
}
부모가 필요하지 않은 경우 a Match
, 그 다음에 dynamic_cast
NULL을 반환 할 수 있으므로 확인하십시오.
다른 팁
나는 당신이 당신의 계층 구조와 방법 이름을 재구성해야한다고 생각합니다 ... 이것은 당신의 질문과 관련이 없지만 일반적으로 왜 일치에서 상속을 설정하는지 추측하기가 어렵습니다. (일치에 세트가 없습니까?)
게임은 포인트로 구성되며 세트는 게임으로 구성되며 경기는 세트로 구성됩니다. 포인트는 플레이어가 승리합니다.
당신은 아마도 그것을 현실 세계에 더 가깝게 구성해야 할 것입니다.
내 $ .02
편집하다
아마도 sets 맵 (즉, 세트 1, 2 개의 3 등)과 player1 () 및 player2 ()가 아닌 메소드 플레이어 (int)를 포함하는 일치 객체가있을 것입니다. 또한 세트 클래스에서 플레이어를위한 방법이 필요하지 않은 것 같습니다. 세트는 그것이 재생되는 경기를 가리 킵니다.