派生クラスの要素のスタックを実装する抽象クラスを使用しました
-
22-09-2019 - |
質問
私はこれだけ明確にすることが、私の大学での基本的なC ++講座のためにこれをしなければならない:私がさせた場合、私はSTLを使用しているだろう。
。問題:私は、クラス「キューブ」と「球」を得、そこから「shape3d」という名前のクラスを持っています。今私は、タイプ「キューブ」と「球」のオブジェクトを保持することができるよう意図され、「shape3d_stack」を実装する必要があります。私はこのための配列を使用して、私はint型のスタックでそうしようとしたとき、それは非常によく働きました。私はそうのようにそれを実行しようとしました。
shape3d_stack.cppます:
15 // more stuff
16
17 shape3d_stack::shape3d_stack (unsigned size) :
18 array_ (NULL),
19 count_ (0),
20 size_ (size)
21 { array_ = new shape3d[size]; }
22
23 // more stuff
しかし、残念ながら、コンパイラは私に語っます:
g++ -Wall -O2 -pedantic -I../../UnitTest++/src/ -c shape3d_stack.cpp -o shape3d_stack.o
shape3d_stack.cpp: In constructor ‘shape3d_stack::shape3d_stack(unsigned int)’:
shape3d_stack.cpp:21: error: cannot allocate an object of abstract type ‘shape3d’
shape3d.hpp:10: note: because the following virtual functions are pure within ‘shape3d’:
shape3d.hpp:16: note: virtual double shape3d::area() const
shape3d.hpp:17: note: virtual double shape3d::volume() const
私は、これは自分自身によって引き起こさ本当に醜い設計エラーのいくつかの種類でなければならないと思います。ので、どのように私のスタックで「shape3d」から派生したオブジェクトのすべての種類を使用しての正しい方法でしょうか?
解決
あなたは抽象クラスからオブジェクトを作成することはできません。
おそらく、許可されている抽象クラスへのポインタの配列を作成し、導出インスタンスでそれらを埋めることになるでしょう。
// declaration somewhere:
shape3d** array_;
// initalization later:
array_ = new shape3d*[size];
// fill later, triangle is derived from shape3d:
array_[0] = new triangle;
他のヒント
の行
array_ = new shape3d[size];
はshape3dオブジェクトの配列を割り当てます。ない立方体、球ではない、単なる古いshape3d。しかし、それは、それは抽象的であるとして、一つでもshape3dオブジェクトを作成することはできません。
ポインタおよび/または参照ではなく、文字通りのオブジェクト:一般的には、使用多型と仮想関数に、あなたは間接を使用する必要があります。 shape3d *立方体や球を指しますが、shape3dは常にshape3d、ないshape3dのサブクラスであるかもしれません。
shape3d
は抽象基本クラスですので、あなたはおそらく、むしろ実際のオブジェクトよりも、shape3d
へのストアのポインタへのあなたのスタックが欲しいます。
あなたは抽象クラスの新しい配列を作成することはできません。あなたはあなたがそれはあなたがお好みの派生クラスのオブジェクトを割り当てることが可能である形状の種類を知っているときに、後に続いポインタの配列として宣言し、何を行うことができます。
の代わりにオブジェクトのスタックの、あなたはオブジェクトへのポインタのスタックを作成する必要があります。