1

私はチェスのゲームを作っています。四角をクリックすると、そこにどの駒があるか知りたいです。複数の種類のピースがあるため、Square 構造にさらに多くの変数があると面倒です。

だから私はピースの各タイプの親であるピースという名前のクラスについて考えました。

例。

class Pawn : public Piece

次のような正方形の構造を実現したい:

struct Square { Piece *piece };

今、私はこのようにピース変数を初期化したいと思います:

piece = new Pawn(); // or what type of piece it should be.

私の問題は、これを行うことで、Pawns のクラス関数ではなく、Piece のクラス関数にしかアクセスできないことです。

子供が持っているものすべてにアクセスできる親が 1 人だけになるようにするにはどうすればよいですか?

4

2 に答える 2

4

仮想関数を作成できます。基本クラスで仮想関数を定義し、子クラスでオーバーライドします。

例えば

class Base
{
public:
    const char* SayHi() { return "Hi"; } // a normal non-virtual function    

    virtual const char* GetName() { return "Base"; } // a normal virtual function

    virtual int GetValue() = 0; // a pure virtual function
};
class Child:public Base{
{
    int GetValue(){
    //write any code here
    //return something;
    }
}

詳細については、リンクを参照してください: http://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-interface-classes/

于 2013-08-19T00:30:10.487 に答える
3

最善のアプローチは、この状況を回避することですPiece。すべてのサブクラスに対して統一されたインターフェイスを作成できますか? これが可能な場合は、あまりためらうことなくこのデザインを選択してください。なぜなら、以下で説明する内容ははるかに複雑であり、読みにくいからです。

基本型へのポインターを介して派生型のメンバー関数にアクセスすることはできないため、いくつかの方法のいずれかでこれを回避する必要があります。

  • 使用dynamic_cast<Derived>- これは非常に単純ですが、非常に壊れやすいものです。継承構造への変更は、頻繁な動的キャストに基づくアプローチを壊す可能性があります。
  • VisitorPatternを使用する- これは、クラス構造が変更されることが予想されない場合に適しています (モデル化する予定の型のリストは、何世紀にもわたって変更されていません)。
  • ランタイム型情報と関数オブジェクトのマップを使用する- このアプローチは非常に柔軟ですが、やや読みにくいです。ただし、C++11 のラムダを使用すると簡単になります。
于 2013-08-19T00:33:22.447 に答える