2009-08-04 6 views
7

これで何が起きているのか分かりません。C++のオーバーライドメソッド

私はエンティティのベクトルを持っており、あなたがシーンからエンティティを追加して取得することができますSceneクラスがあります。次のように

class Scene { 
    private: 
     // -- PRIVATE DATA ------ 
     vector<Entity> entityList; 
    public: 
     // -- STRUCTORS --------- 
     Scene(); 
     // -- PUBLIC METHODS ---- 
     void addEntity(Entity); // Add entity to list 
     Entity getEntity(int); // Get entity from list 
     int entityCount(); 
}; 

私のエンティティクラスは(出力がテストのためである)である:

あなたのよう

class Polygon: public Entity 
{ 
    private: 
     // -- PRIVATE DATA ------ 
     vector<Point2D> vertexList; // List of vertices 
    public: 
     // -- STRUCTORS --------- 
     Polygon() {}; // Default constructor 
     Polygon(vector<Point2D>); // Declare polygon by points 
     // -- PUBLIC METHODS ---- 
     int vertexCount(); // Return number of vertices 
     void addVertex(Point2D); // Add vertex 
     void draw() { cout << "Yes" << endl; }; // Draw polygon 
     // -- ACCESSORS --------- 
     Point2D getVertex(int); // Return vertex 
}; 

class Entity { 
    public: 
     virtual void draw() { cout << "No" << endl; }; 
}; 

そして私は、エンティティから継承ポリゴンクラスを持っていますそれがEntityクラスから継承するdraw()メソッドをオーバーライドする必要があるdraw()メソッドがあります。

しかし、そうではありません。次のコードを使用する場合:

scene->getEntity(0).draw(); 

エンティティ0が多角形である(または少なくともあるべきである)(それはポリゴン、単にエンティティではないかのように)、それが「No」で親メソッドから印刷します。実際には、私が得ることなくポリゴンに固有の任意のメソッドを呼び出すせていないようだ。

いくつかのメソッド名を」まで何任意のアイデアだから、「エンティティ」

のメンバーではないでしょうか?

ありがとうございました。

UPDATE:

だから私は、最初の答えで与えられたコードを実装しましたが、私はリストに私のポリゴンを追加するかどうかはわかりません。このようなもの?

const tr1::shared_ptr<Entity>& poly = new Polygon; 
poly->addVertex(Point2D(100,100)); 
poly->addVertex(Point2D(100,200)); 
poly->addVertex(Point2D(200,200)); 
poly->addVertex(Point2D(200,100)); 
scene->addEntity(poly); 

私はこのshared_ptrビジネスに慣れていません。

+1

SceneクラスのEntityオブジェクトのコピーではなく、エンティティへのポインタを格納してみます。 – chollida

答えて

14

私はあなたの呼び出しコードを投稿する必要があると思いますが、本質的な問題はこれです。

あなたは別の具体的なクラスに由来する具体的なクラスPolygonを持っていますEntity。あなたのaddEntity関数とgetEntity関数は、Entityの値でを返すので、Entityを渡すか取得しようとすると、そのオブジェクト(スライスしている)の一部とオブジェクトの派生した部分の情報だけがコピーされます(Entity)失うだろう。

さらに、vectorEntityです。これは基本クラスオブジェクトのベクターであるため、オブジェクトの基本タイプ以外のものを保存する方法はありません。

使用すると、オブジェクトの混合型のコレクションを持っている必要がありますが、すべてがEntity由来する場合は、動的に作成されたオブジェクトや、tr1::shared_ptrboost::shared_ptrとしてスマートポインタのいくつかの並べ替えを使用する必要があります。

など。

class Scene { 
    private: 
     // -- PRIVATE DATA ------ 
     vector< std::tr1::shared_ptr<Entity> > entityList; 
    public: 
     // -- STRUCTORS --------- 
     Scene(); 
     // -- PUBLIC METHODS ---- 
     void addEntity(const std::tr1::shared_ptr<Entity>&); // Add entity to list 
     const std::tr1::shared_ptr<Entity> getEntity(int); // Get entity from list 
     int entityCount(); 
}; 

編集

共有ポインタにローカルのconst参照を使用してビット不明瞭であるが、更新された呼び出し元のコードは、本質的に正確です。

私はおそらくのようなものでいいと思う:

std::tr1::shared_ptr<Polygon> poly(new Polygon); 
poly->addVertex(Point2D(100,100)); 
poly->addVertex(Point2D(100,200)); 
poly->addVertex(Point2D(200,200)); 
poly->addVertex(Point2D(200,100)); 
scene->addEntity(poly); 
+3

または、図形的に配置するには、ポリゴンを取り込んでエンティティサイズのボックスに入れて、投稿されたコードがすべて収まるとは限りません。 –

+0

OPをこの新しいコードに関する質問で更新しました。 –

+0

今の問題はaddVertexは()ポリゴンに固有であるということである。 エラーC2039:「addVertexは」:大きな助けのための「実体」 感謝のメンバーではありません。 (申し訳ありませんが、これらの余分な質問をコメントに投稿する必要があるかどうかはわかりません) –

1

chollidaさんのコメントが正しいです:あなたはタイプエンティティのためのものメモリ位置にタイプポリゴンのオブジェクトをプッシュし、と呼ばれるものに実行していますスライス。余分な「ポリゴン」の情報がスライスされ、残ったのはエンティティです。

これらの状況では、基本クラスにポインタ(または可能であれば参照)を格納する必要があります。

0

最初にEntityインスタンスにポインタ(スマートポインタ:)を格納することをお勧めします。挿入時にベクターが再割り当てされるため、ゲッターメソッドを呼び出す前にオブジェクトがスライスされます。

getterメソッドの戻り値の型もポインタまたは参照である必要がありますので、そのpolimorphic呼び出しを行うことができます。

1

これには純粋な仮想関数を使用する必要があります。

class Entity 
{ 
public: 
    virtual void draw() = 0; 
}; 

次に、オブジェクトからdraw関数を呼び出して、オブジェクトへのポインタも使用する必要があります。

+0

>これには純粋な仮想関数を使用する必要があります。 必ずしもそうではありません。 Entityクラスは確かに具体的な描画メソッドを持つことができます。 – chollida

0

多態的に使用するオブジェクトを扱う際は、値セマンティクスではなく、常に参照セマンティクス(ポインタまたは参照によるアクセスオブジェクト)を使用する必要があります。

このように安全を確保するには、プライベートコピーコンストラクタと代入演算子を作成して、すべてのポリモフィックタイプの基本クラスをnoncopyableにすることをおすすめします。誤って値のセマンティクスが使用された場合、コードが単にコンパイルに失敗するため、スライシングが効果的に防止されます。

関連する問題