2016-10-28 5 views
0

実行時にユーザー定義サイズのクラスのオブジェクトを作成したいと考えています。 ユーザーが5を入力したときと同様に、5つのオブジェクトが作成されます。 私はこのC++でのユーザー定義サイズのクラスのオブジェクトの作成

student s[num]; 

for(int i=0;i<num;i++) 
{ 
    student s[i]; // also used student s[i]=new student(); 
} 

を試してみましたが、それはstudent s[num]式が一定の値を持たなければならないと言います。 これを行うにはどうすればいいですか?

+9

'のstd ::ベクトル S(NUM);よりArrayList'' 'のような –

+0

。 –

+0

ベクトル s(num);不完全なタイプは許可されていないと言います。 –

答えて

3

std::vectorがこの目的のために作られた。 (基本的に、動的に割り当てられた配列)は事前に割り当てて構成するための要素の数を取るコンストラクタを有する。

#include <vector> 
std::vector<student> students(num); 

あなたは、通常の配列として、それをループすることができる:

for(unsigned int i = 0; i < students.size(); ++i) 
{ 
    //students[i].. 
} 

あるいは、もし

for(auto const& student : students) 
{ 
    //student.. 
} 

それとも、それはだイテレータ:

あなたはC++ 11の使用範囲ベースのループへのアクセス権を持っています
+0

おそらく 'students [i]'の代わりに 'students.at(i)'を使用して、実行時の境界チェックを取得します。 –

+0

@AaronMcDaid私は 'i

+0

私は知っていますが、私はまだ誰もベクター上で '[]'を使うべきではないと考えています。それを許すのは悪い習慣です。もし私がC++を教えていたら、それが存在することは言及しません! :-) –

0

また、動的に割り当ておよび割り当てを解除することもできます。新しい[]を削除することを忘れないでください!

#include <iostream> 



struct MyObj { 
    float a; 
    float b; 
}; 


int main() { 

    int num = 10; 

    MyObj* objs = new MyObj[num]; 

    for(int i = 0; i < num; i++) { 
     objs[i].a = i; 
     objs[i].b = i*2; 
    } 

    std::cout << objs[3].a << " * 2 = " << objs[3].b << std::endl; 

    delete [] objs; 

    return 0; 
} 

Test

+0

最後にすべてのオブジェクトを削除するか、使用しなくなったらすぐに削除するべきですか? またはC#.netのようなC++のガベージコレクタはありますか? –

+0

ガベージコレクションはありません。オブジェクトを削除しないと、メモリリークが発生します。オブジェクトを終了するときはいつでもオブジェクトを削除する必要があります。あなたがそれを削除する前にそのポインタを再割り当てすることによって、メモリのブロックを失わないことを確実にする論理的な意味があるときはいつでも。 – Chemistpp

関連する問題