2016-04-29 12 views
1

は、だから今私はこのようなクラスのオブジェクトの配列を持っている:クラスオブジェクトの配列をベクトル配列に変換するにはどうすればよいですか?

ClassA* object1[10]; 
object1[0] = new ClassA(); 
object1[1] = new ClassA(); 

今私はschabloneを使用したい:

vector <ClassA> ver(10); 

私はこれが正しいかどうかを確認していません。テンプレート、しかし、どのように私は主な機能でこのベクトル配列に新しいオブジェクトを挿入するのですか?

+0

:(あなたが多型の要素を持っているので、例えば)本当に、ベクター内のポインタがあることが必要、単にオブジェクトのではなく、ポインタのベクトルを使用できますか? –

答えて

2

どのように私は

verはすでに10デフォルト初期化されたオブジェクトが含まれている主な機能には、このベクトル配列に新しいオブジェクトを挿入します。だからあなたは行くことができ、オブジェクトの使用を開始します。ボーナスはあなたがそれを削除する必要はありません。

可能な用法オブジェクトの数が固定され、コンパイル時にわかっている場合ver[3].classAFunc();

std::arrayは、ほとんどの場合、std::vectorを超える、より良い選択かもしれません。

2

pushing backまたはemplacing backのいずれかで追加できます。例:

std::vector<ClassA*> objects; 
objects.push_back(new ClassA()); 
object1.push_back(new ClassA()); 

それとも、初期化リストを使用することができます。

std::vector<ClassA*> objects{{new ClassA(), new ClassA()}}; 

は、あなたはまだオブジェクトを削除するために覚えておく必要があります。

shared_ptrsのベクトルを持つ方がよいでしょう。

+0

ありがとうございますが、私は@モート・ジャインによって投稿された回答をもっと探していました。 :) –

1

なぜ生ポインタと生の動的配列を最初に使用していますか?

あなたの最初の行に動的配列を作成するためのC++の方法は、次のようになります。

std::vector<ClassA*> object1(10); 

これはその中の10のヌルポインタのベクトルを作成します。

次の2行は同じですが、ClassAオブジェクトのオブジェクトのライフタイムとメモリを手動で管理するという問題があります。のは、スマートポインタを使用して、その問題を修正しましょう:

std::vector<std::unique_ptr<ClassA>> object1(10); 
object1[0] = std::make_unique<ClassA>(); 
object1[1] = std::make_unique<ClassA>(); 

状況によっては、おそらく正確に10個の要素と最後の8であることはnullポインタを持つベクトルを必要としません。

std::vector<std::unique_ptr<ClassA>> object1; //empty vector 
object1.push_back(std::make_unique<ClassA>()); //now has 1 element 
object1.push_back(std::make_unique<ClassA>()); //now has 2 elements 

そして最後改善など、あなたがない限り:あなたは、ベクターが実際に設定され、その後、ベクトルに初期サイズを割り当てないと、ちょうどあなたがacutally持つオブジェクトに押し込むだけの要素を含むようにしたい場合新しい[] `例1で`使用しないのはなぜ

std::vector<ClassA> object1; //empty vector 
object1.push_back(ClassA{}); //now has 1 element 
object1.push_back(ClassA{}); //now has 2 elements