2011-10-24 8 views
4

複数のクラスからオブジェクトを保持する配列を作成する必要があります。C++でオブジェクトの配列を作成する(異なるクラスから)

class baseClass 
{ 
    // 
}; 

class first : baseClass 
{ 
    // 
}; 

class second : baseClass 
{ 
    // 
}; 

どのように私はそれの内側firstおよび/またはsecondオブジェクトを保持できる配列を作成できますか?

それはので、私は配列を使用するように強制しています、私はすでに

...検索し、それは、そのようなブーストライブラリのANSで行われていることを知っているが、私はここでみんなをnoオプションを持っていない私にとってはやや自宅タスクのです
+0

類似:http://stackoverflow.com/questions/7018183/provide-array-of-derived-objects-to-function-that-operates-on-base-objects – tinman

答えて

2
baseClass *array[10]; 
baseClass **array2 = new baseClass *[size]; 

これは最も簡単で危険な方法です。漏れや二重の解放を避けるために、オブジェクトの寿命について注意する必要があります。特に、実行時にサイズを変更する必要がある場合は、配列の割り当てと割り当て解除に注意する必要があります。

std::vector<baseClass*> vec; 

ベクトルがあなたのために、配列のメモリを扱うが、あなたはまだ基底クラスのポインタで注意しなければならないので、これは前の例を向上させます。

std::vector<boost::variant<first,second> > vec2; 

これは、手動でオブジェクトにメモリを割り当てるか、割り当て解除する必要がなくなり、別の改良であり、それは初や秒などのオブジェクトへのアクセスの面で安全で入力します。ある種類のオブジェクトを別の種類のものと間違えることはできません。このオプションで

std::vector<std::unique_ptr<baseClass>> vec3; 

あなたはまだお互いのために、異なる種類のオブジェクトを混同することができ、それが唯一の標準ライブラリを使用して、あなたはまだあなたが割り当てるオブジェクトの寿命を管理する必要はありません。それはC++ 11を使用します。あなたが動的配列を必要としない場合

また、あなたはstd::array<...,size>

std::array<std::unique_ptr<baseClass>,10> array3;baseClass *array[10];オーバー実行時に絶対的にゼロスペースや時間のオーバーヘッドを持っており、より安全で使用することができます。 (ゼロオーバーヘッド、まともな実装を想定)

5

これは、ブーストまたはC++ 11のいずれかのバージョンのスマートポインタの配列をベースクラスに作成するのがベストプラクティスです。これをポインタ配列にすると、オブジェクトにアクセスするときにオブジェクトをスライスする危険性がなくなります。スマートポインタを使用すると、メモリリークのリスクが軽減されます。それを基本クラスポインタにすることは、どちらかの派生クラスをそこに安全に格納できることを意味します。

2

あなたのようなポインタの配列を必要とするライブラリあなたが使用できない場合:

baseClass *array[123]; 
array[0] = new first(); 
array[1] = new second(); 

と何のスライスは発生しません。

関連する問題