如何制作一个形状列表,这是抽象类?

时间:2014-04-17 16:32:45

标签: c++ visual-c++ polymorphism abstract-class

我正在研究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++;
}



};

2 个答案:

答案 0 :(得分:0)

您需要一个指针数组到抽象类。即Shape** shapesshapes = 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容器!