2016-10-28 47 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);' –

+0

更像'ArrayList'。 –

+0

vector s(num);說不完整的類型不允許。 –

回答

3

A std::vector就是爲此目的而製作的。 (基本上是動態分配的數組)它有一個構造函數取元件的數量來預分配和構造:

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

你也可以遍歷它作爲一個正常的數組:

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

或者,如果您可以訪問C++ 11使用基於範圍的循環:

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

或者,這是迭代器:

for(std::vector<student>::iterator itr = students.begin(); itr != students.end(); ++itr) 
{ 
    //access with *itr.. 
} 
+0

也許使用'students.at(i)'而不是'students [i]'來獲得運行時間邊界檢查。 –

+0

@AaronMcDaid我們使用'我

+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

中通常將'at()'轉換爲'[]'應該最後刪除所有對象,或者在它們不再使用時立即刪除它們。 或者是否有像C#.net一樣的C++垃圾收集器? –

+0

沒有垃圾回收。如果你不刪除一個對象,你會引入內存泄漏。每當你完成它,你應該刪除這個對象。只要有邏輯意義,以確保在刪除它之前通過重新分配其指針來避免丟失一塊內存。 – Chemistpp

相關問題