C ++: Ungültige Konvertierung von 'Basenode*' zu 'Match*'
-
19-08-2019 - |
Frage
Alle Objekte in meinem Programm erben von einer Containerklasse. Die Containerklasse hat eine virtual BaseNode* getParent() const;
Methode und a virtual void setParent(BaseNode *p);
Methode.
Ich habe ein Set
Klasse (in einer Tennisübereinstimmung festgelegt, keine Datenstruktur), die das hat Match
Klasse als Elternteil (über setParent()
) aber seit Set
Erben von Container
, Das Programm schafft eine Baumstruktur von oben nach unten und die Set
Klasse ist ein Kind, es muss keine Methoden haben, um Informationen über das übergeordnete Elternteil zu verfolgen und zu pflegen Container
bietet.
Der Fehler C++: invalid conversion from ‘BaseNode*’ to ‘Match*’
zeigt sich in der folgenden Methode, wenn ich versuche, mein Programm zu kompilieren. (Player* getPlayer1() const;
existiert nur in der Match
Klasse)
Player* Set::getPlayer1() const{
return getParent()->getPlayer1();
}
Dies ist meine Vererbungsstruktur für die Übereinstimmung. (Beachten Sie, dass TreeNode
ist eine Vorlage)
Match -> TreeNode<Set> -> BaseNode -> Container
Ich verstehe nicht, warum ich einen Gesprächsfehler bekomme. Ich habe versucht, mein Lehrbuch zu lesen, aber es ist eine ziemlich schlechte Referenz. Google lieferte einfach zu viel irrelevante Informationen.
Bearbeiten
Player* Set::getPlayer1() const{
return dynamic_cast<Match>(getParent())->getPlayer1();
}
Ursachen
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)
Bearbeiten 2
Mir wurde nur gemerkt, dass ich brauche dynamic_cast<Match*>
was funktioniert.
Lösung
Das Problem ist, dass getParent()
Gibt eine zurück BaseNode*
, was ein Zeiger auf jede Art von sein könnte BaseNode
- Es könnte auf eine nicht verwandte Klasse hinweisen, aus der auch abgeleitet wird BaseNode
. Wenn Sie zu 100% sicher sind, dass der Elternteil vom Typ sein muss Match
, Sie sollten die Eltern zu einem werfen Match*
Zuerst können Sie anrufen getPlayer()
auf diesem:
Player* Set::getPlayer1() const{
return dynamic_cast<Match*>(getParent())->getPlayer1();
}
Wenn der Elternteil nicht notwendig ist a Match
, dann dynamic_cast
Könnte NULL zurückgeben, also achten Sie darauf.
Andere Tipps
Ich denke, Sie müssen Ihre Hierarchie- und Method-Namen wirklich neu organisieren ... das hat nichts mit Ihrer Frage zu tun, aber im Allgemeinen scheint es schwierig zu ergründen, warum Erbungen aus der Übereinstimmung festgelegt werden. (Hat ein Match keine Sätze?)
Spiele bestehen aus Punkten, Sets bestehen aus Spielen und ein Match besteht aus Sets ... Ein Punkt wird von einem Spieler gewonnen.
Sie sollten es wahrscheinlich enger auf die reale Welt strukturieren.
Nur meine $ .02
BEARBEITEN
Ich hätte wahrscheinlich ein Match -Objekt, das eine Karte von Sets (Karte IE eins, zwei drei usw.) und den Method Player (int) anstelle von Player1 () und Player2 () enthält. Es scheint auch nicht notwendig, eine Methode für den Spieler in der SET -Klasse zu haben. Ein Set würde auf ein Match hinweisen, in dem es gespielt wird.