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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top