Tôi đang làm việc trên một ứng dụng đồ họa đang sử dụng các lớp ảo khá rộng rãi. Nó có:Lớp học ảo tinh khiết và bộ sưu tập (vector?)
Lớp ảnh, về cơ bản là tập hợp các hình dạng.
Một lớp hình dạng, mà hoàn toàn là ảo và có một vài lớp kế thừa từ nó:
- Vòng
- Polygon
- Rectangle
Một hình hình dạng, mà là bất kỳ hình đồ họa (cũng ảo), hình dạng kế thừa từ này.
Về cơ bản, vấn đề của tôi là sử dụng để lưu trữ bộ sưu tập hình dạng. Tôi hiện đang sử dụng Vector để lưu trữ các hình dạng, tuy nhiên, rõ ràng đây là quyết định sai kể từ khi Vector khởi tạo các hình dạng này, điều này không tốt vì chúng hoàn toàn là ảo.
Dưới đây là cơ sở mã hiện tại của tôi (tóm tắt một chút):
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);
}
...
Các thông báo lỗi tôi nhận được chỉ là một bó của những:
picture.cpp:33: instantiated from here /opt/local/bin/../lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++/4.4.1/ext/new_allocator.h:105: error: cannot allocate an object of abstract type 'Shape' shape.h:12: note: because the following virtual functions are pure within 'Shape': shape.h:58: note: virtual void Shape::get(std::istream&) shape.h:31: note: virtual void Shape::put(std::ostream&) const shape.h:36: note: virtual 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: note: virtual RectangularArea Shape::boundingBox() const shape.h:21: note: virtual Shape* Shape::clone() const shape.h:55: note: virtual void Shape::draw(Graphics&) const
Vì vậy, cách lý tưởng là gì để lưu trữ những hình dạng này. Tôi nên sử dụng loại bộ sưu tập nào để lưu trữ những thứ này?
Cảm ơn
Với các tính năng C++ 0x như con trỏ thông minh được cải thiện và ngữ nghĩa di chuyển, thậm chí có thể tạo phiên bản an toàn cho bộ nhớ này ('vector>'). –
bobbymcr
Nếu bạn không sử dụng con trỏ thông minh, hãy nhớ vùng chứa sẽ không tự động dọn sạch dữ liệu được trỏ tới. Nó gọi destructors trên con trỏ - nhưng những destructors không làm bất cứ điều gì. Bạn nên thêm một destructor vào lớp hình ảnh của bạn mà iterates thông qua các hình dạng xóa chúng. Sử dụng một lớp con trỏ thông minh, như bobbymcr gợi ý, tránh vấn đề này. – Steve314
Bạn là người đàn ông! Cảm ơn bạn rất nhiều. Điều đó là vậy đó. –