2009-10-19 3 views
0

Я должен сделать это для основной лекции C++ в своем университете, поэтому просто чтобы быть ясным: я бы использовал STL, если мне было позволено.Использование абстрактного класса для реализации стека элементов производного класса

Проблема: У меня есть класс под названием «shape3d», из которого я получил классы «куб» и «сфера». Теперь мне нужно реализовать «shape3d_stack», который подразумевает возможность хранения объектов типов «куб» и «сфера». Я использовал для этого массивы, и он работал достаточно хорошо, когда я пытался сделать это со стеком ints. Я пытался сделать это так:

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» с моим стеком?

ответ

7

Вы не можете создавать объекты из абстрактных классов.
Вы, вероятно, захотите создать массив указателей на абстрактный класс, который позволил, и заполнить их производные экземпляры:

// declaration somewhere: 
shape3d** array_; 

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

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

Линия

array_ = new shape3d[size]; 

выделяет массив shape3d объекты. Не кубы, не сферы, просто старая форма3d. Но невозможно создать даже один объект shape3d, поскольку он является абстрактным.

В целом, чтобы использовать полиморфизм и виртуальные функции, вам необходимо использовать косвенные указатели и/или ссылки, а не литералы. Форма3d * может указывать на куб или на сферу, но shape3d всегда является shape3d, а не подклассом shape3d.

0

С shape3d является абстрактным базовым классом, вы, вероятно, хотите, чтобы ваш стек сохранял указатели на shape3d, а не на фактические объекты.

0

Вы не можете создать новый массив абстрактного класса. Что вы можете сделать, это объявить его как массив указателей, а затем, когда вы знаете, какой тип формы вы можете выделить объекты производного класса по вашему выбору.

0

Вместо стека объектов вам необходимо создать стек указателей на объекты.

Смежные вопросы