我正在研究c ++中的多态性。我有一个形状抽象类和一些继承形状类的类。现在我想要一个形状列表。但是当我使用shape作为数组类型时,它表示"不允许使用抽象类数组"我也知道我们不能创建抽象类的实例。 该怎么办?
class List
{
int count;
int size;
shape* shapes;
public:
int getCount()
{
return count;
}
List(int n=4)
{
count=0;
shapes=new shape[n];
size=n;
}
~List()
{
if(shapes!=NULL)
delete[] shapes;
shapes=NULL;
}
int getItem(int index)
{
return shapes[index];
}
void insert(shape& sh,int index)
{
if(index<=-1)
{
cout<<"Index should be non-negative."<<endl;
return;
}
if(index>count)
index=count;
for(int i=count-1;i>=index;i--)
shapes[i+1]=shapes[i];
shapes[index]=num;
count++;
}
};
答案 0 :(得分:0)
您需要一个指针数组到抽象类。即Shape** shapes
,shapes = new Shape*[n]
。
shapes[index]=sh
的问题是sh
是引用到Shape
,而不是指针到一个。您可以修改插入,如下所示:
void insert(Shape* shape, int index) {
// ...
shapes[index] = sh;
}
或做类似的事情:
void insert(Shape& shape, int index) {
// ...
shapes[index] = &sh;
}
答案 1 :(得分:0)
您需要使用指向Shape
的指针数组,或者更好地使用指向Shape
的智能指针的STL容器。类似的东西:
#include <vector>
#include <memory>
struct Shape {
virtual ~Shape() = 0;
};
Shape::~Shape(){}
struct Square : public Shape {
};
class List {
std::vector<std::unique_ptr<Shape>> shapes;
public:
int getCount() const {return shapes.size();}
const Shape* getItem(int index) const;
void insert(std::unique_ptr<Shape>, int index);
};
const Shape*
List::getItem(int index) const {
if (index < 0 || (size_t) index >= shapes.size())
return nullptr;
return shapes[index].get();
}
void
List::insert(std::unique_ptr<Shape> sh, int index) {
if (index < 0)
return;
if ((size_t)index >= shapes.size())
index = shapes.size();
shapes.insert(shapes.begin() + index, std::move(sh));
}
int main() {
List list;
list.insert(std::unique_ptr<Shape>(new Square()), 0);
list.insert(std::unique_ptr<Shape>(new Square()), 0);
list.insert(std::unique_ptr<Shape>(new Square()), 2);
const Shape* sh = list.getItem(0);
}
或者更好的是,如果可能的话,不要编写自己的List
课程,而是直接使用智能指针的STL容器!