我正在开发一个相当广泛地使用虚拟类的图形应用程序。它有:
图片类,本质上是形状的集合。
一个 shape 类,它是纯虚拟的,并且有几个继承自它的类:
- 圆圈
- 多边形
- 长方形
图形形状,它是任何图形图形(也是虚拟的),形状继承自此。
本质上,我的问题归结为实现图片类,它基本上用于存储形状的集合。我目前正在使用 Vector 来存储形状,但是,很明显这是错误的决定,因为 Vector 实例化了这些形状,这并不好,因为它们是纯虚拟的。
以下是我当前的代码库(总结了一下):
class Figure {
public:
...
virtual ~Figure();
...
};
class Shape: public Figure
{
public:
...
virtual ~Shape() {}
virtual Shape* clone() const = 0;
...
};
class Polygon : public Shape
{
public:
...
virtual Shape* clone() const {return new Polygon(*this);}
...
private:
std::vector<Point> points;
};
class Picture: public Figure {
public:
...
Picture(Graphics& gd);
Picture (const Picture&);
~Picture();
void clear();
void add (const Shape&);
...
private:
std::vector<Shape> shapes;
Graphics* gfx;
};
//Picture implementation:
...
Picture::Picture(Graphics& gd)
{
gfx = &gd;
}
Picture::Picture(const Picture& a)
{
shapes = a.shapes;
}
Picture::~Picture()
{
clear();
}
void Picture::clear()
{
shapes.clear();
}
void Picture::add (const Shape& shp)
{
Shape* nshp = shp.clone();
shapes.push_back(*nshp);
}
...
我收到的错误消息只是其中的一堆:
picture.cpp:33:从这里实例化 /opt/local/bin/../lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++ /4.4.1/ext/new_allocator.h:105:错误:无法分配抽象类型“Shape”shape.h:12的对象:注意:因为以下虚函数在“Shape”中是纯的:shape.h:58 : 注意: 虚拟 void Shape::get(std::istream&) shape.h:31: 注意: 虚拟 void Shape::put(std::ostream&) const shape.h:36: 注意: 虚拟 void Shape::scale (const Point&, double) shape.h:40: note: virtual void Shape::translate(double, double) shape.h:45: note: virtual void Shape::reflectHorizontally(double) shape.h:49: note: virtual void Shape::reflectVertically(double) shape.h:52: 注意:virtual RectangularArea Shape::boundingBox() const shape。h:21: note: virtual Shape* Shape::clone() const shape.h:55: note: virtual void Shape::draw(Graphics&) const
那么存储这些形状的理想方法是什么。我应该使用什么样的收藏品来存储这些东西?
谢谢