私はまだ C++ の経験が浅いので、これが基本的なことである場合はご容赦ください。
以下のようなコードがあります。L
は抽象クラス (多数の純粋仮想関数を持つ) でありA
、 、B
およびC
はすべて から派生した通常のクラスL
です。これらはいくつあっても構いませんが、それらはすべて異なります。
int main() {
// ...
std::vector<L*> ls(3) ;
ls[0] = new A ;
ls[1] = new B ;
ls[2] = new C ;
int i ;
for (i = 0 ; i < ls.size() ; i++) {
if (ls[i]->h()) {
// ...
}
}
// ...
}
それは機能しますが、そのベクトルを初期化するためのより良い方法が本当に必要です。右?
ベクトルは、最初に初期化された後に変更されることは想定されていません。ただし、さまざまなオブジェクト自体が内部で変更される可能性があるため、const にすることはできないと思います。通常の配列よりもベクトルを選択したのは、その長さを手動で追跡したくないためです (エラーが発生しやすいことが判明しました)。
main
理想的には、ベクトルの定義と初期化を別のファイルから取り出し、できれば別のファイルに取り出したいと思います#include
。私が試してみると、コンパイラは「「=」トークンの前にコンストラクタ、デストラクタ、または型変換が必要である」と不平を言います。すべてのクラスA
には、B
デフォルトのC
コンストラクターがあります。
delete
また、 を使用して作成したものはすべて手動で作成する必要があるという印象を受けましたが、またはのいずれでもnew
削除されません。試してみると、コンパイラは「type 'class std::vector<L*, std::allocator<L*> >' argument given to 'delete', expected pointer」と不平を言います。ls
delete
delete[]
delete ls;
上記は安全ですか、それともメモリの問題を引き起こしますか?