C ++:「ベースノード*」から「一致*」への無効な変換
-
19-08-2019 - |
質問
私のプログラム内のすべてのオブジェクトは、コンテナクラスから継承されます。コンテナクラスには virtual BaseNode* getParent() const;
方法とa virtual void setParent(BaseNode *p);
方法。
私は持っています Set
クラス(データ構造ではなくテニスマッチに設定) Match
親としてのクラス(via 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();
}
親が必要ない場合 Match
, 、 それから dynamic_cast
nullを返すかもしれないので、必ず確認してください。
他のヒント
階層とメソッド名を再編成する必要があると思います...これはあなたの質問とは何の関係もありませんが、一般的に、セットがマッチから継承する理由を推測するのは難しいようです。 (試合にはセットがありませんか?)
ゲームはポイントで構成され、セットはゲームで構成され、試合はセットで構成されています...ポイントはプレーヤーによって獲得されます。
おそらく、それを現実の世界により密接に構築する必要があります。
ただ私の$ .02
編集
おそらく、プレーヤー1()とplayer2()ではなく、セットのマップ(Map IEセット1、2つの3つなど)とメソッドプレーヤー(int)を含む一致オブジェクトがあるでしょう。また、セットクラスのプレーヤーのための方法を持つ必要はないようです。セットは、プレイされている試合を指します。