En utilisant une classe abstraite pour mettre en œuvre un empilement d'éléments de la classe dérivée

StackOverflow https://stackoverflow.com/questions/1591269

Question

Je dois le faire pour une conférence ++ C de base à mon université, donc pour être clair: j'aurais utilisé le TSL si j'ai été autorisé à

.

Le problème: J'ai une classe nommée « Shape3D » à partir de laquelle je tirais les classes « cube » et « sphère ». Maintenant, je dois mettre en œuvre « shape3d_stack », qui est censé être en mesure de tenir des objets du type « cube » et « sphère ». J'ai utilisé des tableaux pour cela et cela a fonctionné très bien quand j'ai essayé de le faire avec une pile de ints. J'ai essayé de le faire comme ceci:

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

mais, malheureusement, le compilateur me dit:

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

Je suppose que cela doit être une sorte d'erreur de conception vraiment moche causée par moi-même. alors comment serait la bonne façon d'utiliser toutes sortes d'objets dérivés de « Shape3D » avec ma pile?

Était-ce utile?

La solution

Vous ne pouvez pas créer des objets à partir des classes abstraites.
Vous aurez probablement envie de créer un tableau de pointeurs vers la classe abstraite, ce qui est permis, et les remplir avec des instances dérivées:

// declaration somewhere:
shape3d** array_;

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

// fill later, triangle is derived from shape3d:
array_[0] = new triangle;

Autres conseils

La ligne

array_ = new shape3d[size];

alloue un tableau d'objets Shape3D. Pas cubes, sphères, pas tout simplement vieux Shape3D. Mais il est impossible de créer un objet même Shape3D, comme il est abstrait.

En général, utiliser polymorphisme et fonctions virtuelles, vous devez utiliser indirection: pointeurs et / ou références, pas des objets littéraux. Un Shape3D * peut pointer vers un cube ou une sphère, mais un Shape3D est toujours un Shape3D, pas une sous-classe de Shape3D.

Depuis shape3d est une classe de base abstraite, vous voulez probablement votre pile de pointeurs de magasin à shape3d, plutôt que des objets réels.

Vous ne pouvez pas créer un nouveau tableau de la classe abstraite. Ce que vous pouvez faire est de le déclarer comme un tableau de pointeurs, puis plus tard quand vous savez quel type de forme est que vous pouvez répartir les objets de la classe dérivée de votre choix.

Au lieu d'une pile d'objets, vous devez créer une pile de pointeurs vers des objets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top