ページ 11

抽象クラスをvectorにいれたい

Posted: 2009年12月03日(木) 13:33
by ジャーニー
お久しぶりです
今C++とDXライブラリで制作中のゲームで描画関係だけをクラス配列でまとめて管理したいです
具体的にいうと・・・

std::vector<Draw> draw;
draw.push_back(new DrawLine());
といった感じです
Drawは描画関係の抽象クラスで更新、描画クラスのみ定義しています
DrawLineはDrawクラスを継承し、直線を描画するという描画メソッドを定義し、vectorに追加します
タスクシステムのまねごとのような感じです

ちなみに上を実装しようとした場合Drawクラスを定義し、vectorを作った時点で「抽象クラスはインスタンス化できません」というコンパイルエラーがでてしまいます
上を実装しようとした場合、どのようにすればいいのでしょうか
vectorにこだわっているわけではないですが描画するだけなのでタスクシステムほど大掛かりでなくてもいいのでお願いします

Re:抽象クラスをvectorにいれたい

Posted: 2009年12月03日(木) 13:36
by GPGA
×std::vector<Draw> draw;
○std::vector<Draw*> draw;

追加、削除の頻度が高いならばvectorよりlistを使用することを推奨します。

Re:抽象クラスをvectorにいれたい

Posted: 2009年12月03日(木) 13:41
by ジャーニー
早速のご返事ありがとうございます
listを使うことも考え実装していきます
ありがとうございました

Re:抽象クラスをvectorにいれたい

Posted: 2009年12月03日(木) 13:51
by たかぎ
ポインタにするのが本来のやり方ですが、最近の処理系はshared_ptrを使えることも多いので検討してみてもよいでしょう。

Re:抽象クラスをvectorにいれたい

Posted: 2009年12月03日(木) 14:01
by ジャーニー
色々な提案ありがとうございます
ただちょっと急ぎで作っており検討している時間がなく、頻繁に追加・削除を行うゲームではないので今回はshared_ptrは見送らせていただきます
次回はshared_ptrを考え、作ってみたいと思います

Re:抽象クラスをvectorにいれたい

Posted: 2009年12月03日(木) 14:13
by たかぎ
> 頻繁に追加・削除を行うゲームではないので今回はshared_ptrは見送らせていただきます

頻繁に追加・削除を行う場合は std::listを使うべきであって、shared_ptrは関係ありません。
shared_ptrを使うと、明示的にdeleteしなくても勝手にやってくれるので、メモリ管理(というかオブジェクト管理)が非常に楽になります。
std::vector<Draw*>を使うと、vectorが解体される前に、全メンバに対してdeleteを行わなければなりません。

Re:抽象クラスをvectorにいれたい

Posted: 2009年12月03日(木) 14:26
by ジャーニー
>たかぎさん

メモリ管理が楽になるということですね。
一度調べてみて、すぐに使えるようなら考えてみます。