0

私は C++ が初めてで、ポインタのベクトルをオブジェクトに渡すのに問題があります。具体的には、オブジェクトがメソッドが含まれるクラスのサブクラスであることが問題です。エラーが発生します。

'Player' was not declared in this scope

PlayerVisual私のファイル Visual.cppのサブクラスであり、ヘッダーファイルでも宣言されている次の関数があります。

bool Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList) {
    // Draw Info
}

class Player;ヘッダー ファイルで前方宣言を試みましたが、次のエラーが表示されます。

error: invalid use of incomplete type ‘struct Player’
error: forward declaration of ‘struct Player’

問題は私の定義が循環していることだと思います.PlayerはVisualを拡張しますが、VisualはPlayerポインターのベクトルを処理できるようにするためにPlayerについて知る必要があります。

私の質問は:

可能であれば、スーパークラス メソッドのパラメーターでサブクラスを使用するにはどうすればよいですか?

4

2 に答える 2

3

再設計を検討したいと思います。継承はis-a関係をモデル化します。つまり、設計でPlayer はis-a であるため、他のsのVisual方法を知っています。これは理にかなっていると思いますか?DrawStatusInformationPlayer

を含む、描画可能なすべての要素が実装するインターフェイスを提供し、次に、描画可能なもの、特に潜在的にsを描画Playerできるタイプを提供することができます。これを行うと、循環依存が解消され、デザインがより健全になります。Player

これは実装の問題ではなく、設計の問題であることに注意してください。これが問題に最適な設計であると本当に感じた場合は、Luchianがすでに述べたように、前方宣言とインクルードを組み合わせることができます。

于 2012-06-19T12:34:07.843 に答える
1

PlayerはVisualを拡張しますが、Visualは、Playerポインターのベクトルを処理できるようにするために、Playerについて知っている必要があります。

ファイル別:

  • Player.h-実装をインクルードVisual.hして実装ファイルに移動する
  • Player.cpp-大丈夫なはずです
  • Visual.h-前方宣言Player
  • Visual.cpp-含めるPlayer.h

これはコンパイルエラーを修正するだけですが、デザインにも問題があるようです。Playerから派生している場合Visual、なぜメソッドは

Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList)

存在?きっとあなたはそれを置き換えることができます

Visual::DrawStatusInformation(Timer* timer, std::vector<Visual*>* playerList)

でオーバーライドしますPlayer。また、なぜvector*ではなくvector&

于 2012-06-19T12:28:41.800 に答える