私は OpenGL と C++ を使用して基本的なグラフィック シーン エディターをプログラミングしています。これがコンテキストです。
抽象的で、純粋な仮想関数 draw() が 1 つしかない Drawable クラスがあります。このクラスを Java インターフェイスのように使用しています。
Drawable を継承し、draw() を再実装する多くのクラス。
Drawables へのポインターのリストを含む Scene クラス。
その異なる Drawable オブジェクトを作成し、それらをリストに追加する main.cpp。
私はこの問題を抱えています:
main.cpp で作成されたオブジェクトは常に範囲外になるため、それらを作成し、参照されたオブジェクトで追加関数を実行するだけでは簡単ではありません。(常に有効なポインターのないリストを保持するだけです)。
ほろ苦い解決策は、これらの新しいオブジェクトを new で作成し、Scene クラスが破棄されたときにリスト内のポインターを削除するか、main.cpp でそれらを何らかの形で削除することです。
私はこれがあまり好きではないので、追加機能内のオブジェクトをコピーしてリストにコピーを保存する方法があるかどうかを尋ねたいと思います。コピーされたオブジェクトはすぐに消去されるので問題ありません。その関数内では、私が参加している 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();
...
}
...
十分に説明したことを願っています。