我正在使用 OpenGL 和 C++ 编写一个基本的图形场景编辑器,这是上下文:
我有一个 Drawable 类,它是抽象的,只有一个纯虚函数 draw()。我使用这个类就像一个java接口。
许多类继承自 Drawable 并重新实现 draw()。
一个场景类,其中包含指向可绘制对象的指针列表。
我在其中创建不同的 Drawable 对象并将它们添加到列表中的 main.cpp。
我有这个问题:
在 main.cpp 中创建的对象不断超出范围,因此创建它们并使用引用的对象执行添加函数并不容易。(只是一直保持一个没有有效指针的列表)。
一个苦乐参半的解决方案是使用 new 创建这些新对象,并让 Scene 类在列表被销毁时删除列表中的指针,或者以某种方式在 main.cpp 中删除它们。
我真的不喜欢这样,所以我想问一下是否有一些方法可以在 add 函数中复制对象,然后将副本存储在列表中,这不是问题,因为复制的对象很快就会被删除。在该函数中,我不知道我参加的是 Drawable 的哪个子类。我不能直接复制 Drawable 对象,因为 Drawable 是一个抽象类,不能用 new 来制作 Drawable 对象。只想拥有一个包含不同对象的列表,这些对象都可以执行 draw()。我留下一些代码以防万一:
class Drawable {
public:
virtual void draw() = 0;
virtual ~Drawable() = 0 {}
};
class Figure : public Drawable {
private:
list<Point, allocator<Point>> _points;
int _type;
public:
...
void draw() {
...
}
};
class Scene : public Drawable {
private:
list<Drawable*, allocator<Drawable*>> _drawables;
...
public:
...
void add(Drawable* drawable) {
_drawables.push_back(drawable);
}
~Scene() {
for(iterDrawable it = _drawables.begin(); it != _drawables.end(); ++it)
delete (*it);
}
void draw() {
for(iterDrawable it = _drawables.begin(); it != _drawables.end(); ++it)
(*it)->draw();
}
};
main.cpp
...
void display() {
...
Figure* square = new Figure(GL_POLYGON);
square->add(Point(xSquare, ySquare));
square->add(Point(xSquare + squareWidth, ySquare));
square->add(Point(xSquare + squareWidth, ySquare + squareHeight));
square->add(Point(xSquare, ySquare + squareHeight));
cScene.add(square);
cScene.draw();
...
}
...
我希望我解释得充分。