문제

내 프로그램의 모든 객체는 컨테이너 클래스에서 상속됩니다. 컨테이너 클래스에는 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)를 포함하는 일치 객체가있을 것입니다. 또한 세트 클래스에서 플레이어를위한 방법이 필요하지 않은 것 같습니다. 세트는 그것이 재생되는 경기를 가리 킵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top