使用抽象类来实现的派生类元件的堆叠
-
22-09-2019 - |
题
我要为我的大学基本的C ++讲座做到这一点,所以仅仅是明确的:我已经使用了STL,如果我被允许
。在问题:我已经一类命名为“一个Shape3D”我从中派生类“立方体”和“球”。现在,我要实现“shape3d_stack”,这是指可以持有类型“魔方”和“球”的对象。我用这个数组和它的工作非常好,当我试图用整数一叠这样做。我试图做它像这样:
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
,而不是实际的对象。
可以不创建抽象类的一个新的数组。可以做的是将其声明为指针数组再后来当你知道它是一种类型的形状可以分配派生类你选择的对象上。
代替对象的堆的,则需要创建指针的堆栈的对象。
不隶属于 StackOverflow