0

大学での基本的な C++ の講義でこれを行う必要があるため、明確にするために、許可されていれば STL を使用していたでしょう。

問題: "shape3d" という名前のクラスがあり、そこからクラス "cube" と "sphere" を派生させました。ここで、「shape3d_stack」を実装する必要があります。これは、「cube」および「sphere」タイプのオブジェクトを保持できることを意味します。これには配列を使用しましたが、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」から派生したすべての種類のオブジェクトを使用する正しい方法はどのようになるでしょうか?

4

5 に答える 5

7

抽象クラスからオブジェクトを作成することはできません。
おそらく許可されている抽象クラスへのポインターの配列を作成し、それらを派生インスタンスで埋めたいと思うでしょう:

// declaration somewhere:
shape3d** array_;

// initalization later:
array_ = new shape3d*[size];

// fill later, triangle is derived from shape3d:
array_[0] = new triangle;
于 2009-10-19T21:31:02.450 に答える
3

この線

array_ = new shape3d[size];

shape3d オブジェクトの配列を割り当てます。立方体でも球体でもなく、単なる昔ながらの shape3d です。ただし、shape3d オブジェクトは抽象的であるため、1 つでも作成することはできません。

一般に、ポリモーフィズムと仮想関数を使用するには、間接参照を使用する必要があります。リテラル オブジェクトではなく、ポインターおよび/または参照です。shape3d* は立方体または球を指す場合がありますが、shape3d は常に shape3d であり、shape3d のサブクラスではありません。

于 2009-10-19T21:32:00.257 に答える
0

は抽象基本クラスであるため、実際のオブジェクトではなく へのshape3dポインタをスタックに格納する必要があるでしょう。shape3d

于 2009-10-19T21:32:07.673 に答える
0

抽象クラスの新しい配列を作成することはできません。あなたができることは、それをポインターの配列として宣言し、後でそれがどのタイプの形状であるかがわかったときに、選択した派生クラスのオブジェクトを割り当てることができます。

于 2009-10-19T21:34:40.117 に答える
0

オブジェクトのスタックの代わりに、オブジェクトへのポインターのスタックを作成する必要があります。

于 2009-10-19T21:35:05.820 に答える