2014-10-11 179 views
-1

如何創建多個類實例而不需要單獨鍵入他們的名字?如何在C++中創建一個類的多個實例

int main(){ 
    myClass myInstance_1; 
    myClass myInstance_2; 
    myClass myInstance_3; 
    ... 
    myClass myInstace_10; 
} 
+2

採取'myClass的將myInstance [I];'** **出循環體,宣佈它的for循環爲'myClass的將myInstance [10]以上的;'如果你正在尋找一種方法將不同的值傳遞給每個成員的數組構造,你不會輕易地這樣做(事實上可能是你正試圖解決的*真實*問題) 。 – WhozCraig 2014-10-11 00:51:58

+0

你有完整的警告編譯嗎?使用'-Wall -Wextra -pedantic'和一個選項來選擇最新的C++標準也不會是不妥的。然後編譯器應該大聲抱怨你的代碼。 – Deduplicator 2014-10-11 00:55:01

+1

IMO和所有的尊重:你真的需要閱讀一本好的C++書籍。 – 2014-10-11 00:57:37

回答

1

如何創建多個類實例,而無需單獨鍵入其名稱?

答案是你做的陣列,而不是你嘗試過的方式。

像這樣:

int main() 
{ 
    MyClass myInstance[10]; 

    for(int i = 0; i < 10; i++) 
    { 
     myInstance[i].myClassFunction(); 
    } 
} 

提示:不要使用數組,使用std::vectorstd::array

(見從@ Jarod42回答)

3

你可以做到以下幾點:

int main(){ 
    std::vector<myClass> myInstances; 
    for(int i = 0; i < 10; ++i) { 
     myInstances.emplace_back(i); 
    } 
    myInstances[5].myClassFunction(); 
} 
+0

如果你堅持使用std-container,最好使用適合的配置:'std :: array'。無論如何,一個原始數組也可以工作。 – Deduplicator 2014-10-11 00:56:06

+0

+我認爲這很可能是OP的目標:元素序列的每個*構造的不同值。 – WhozCraig 2014-10-11 00:56:14

+0

你的代碼不會編譯,除非整數'i'可以被轉換成myClass。我不知道是誰投了你的答案。 – 2014-10-11 00:59:00

-1

使用數組:

myClass myInstance[10]; 

這將創建10個實例的陣列,但每個實例都將有其m_number設置爲0

另一種方法:

myClass *myInstance = new myClass[10]; 

for (unsigned int i = 0; i < 10; i++) 
{ 
myInstance[i] = new myClass(i); 
} 

這裏每個實例將具有不同的值m_number


編輯用於固定與上述代碼的問題的緣故。已經提出了更好的解決方案。

myClass *myInstance[10]; 

// Allocate 
for (unsigned int i = 0; i < 10; i++) 
{ 
myInstance[i] = new myClass(i); 
} 

// At the end free 
for (unsigned int i = 0; i < 10; i++) 
{ 
delete myInstance[i]; 
} 
+0

避免原始擁有指針,而是使用'std :: vector'。 (並且你錯過了一個BTW指針)。 – Jarod42 2014-10-11 00:56:47

+2

你的代碼不會編譯。 – 2014-10-11 00:58:00

+0

@ Jarod42:而不是原始的擁有指針,正確的選擇是智能指針,對吧?儘管在這種情況下任何動態分配都不行。 – Deduplicator 2014-10-11 00:58:07

1

解決方案1:使用整數數組作爲初始值設定項,構造函數用於將整數轉換爲myClass。

class myClass 
{ 
public: 
    //constructor 
    myClass(int num) {m_number = num;}; 

    void myClassFunction(){cout<< "I am " << m_number << endl;} 
private: 

    int m_number; 
}; 

int main(){ 
    myClass myInstance[10] = {0,1,2,3,4,5,6,7,8,9}; 
    for (int i=0; i< 10; i++) myInstance[i].myClassFunction(); 
} 

解決方案2:使用靜態計數器設置m_number,因此不需要使用非默認構造函數。

class myClass 
{ 
public: 
    //constructor 
    myClass(){m_number=counter++;}; 

    void myClassFunction(){cout<< "I am " << m_number << endl;} 
private: 

    int m_number; 
    static int counter; 
}; 
int myClass::counter = 0; 

int main(){ 
    myClass myInstance[10]; 
    for (int i=0; i< 10; i++) myInstance[i].myClassFunction(); 
} 

解決方案3:在構造函數調用後設置m_number,所以默認構造函數就足夠了。

class myClass 
{ 
public: 
    //constructor 
    void setNum(int num){m_number=num;}; 

    void myClassFunction(){cout<< "I am " << m_number << endl;} 
private: 

    int m_number; 
}; 

int main(){ 
    myClass myInstance[10]; 
    for (int i=0; i< 10; i++) myInstance[i].setNum(i); 
    for (int i=0; i< 10; i++) myInstance[i].myClassFunction(); 
} 
0

就像Jarod42代碼:

int main(){ 
    std::vector<myClass> myInstances; 
    for(int i = 0; i < 10; ++i) { 
     myInstances.push_back(myClass(i)); 
    } 
    myInstances[5].myClassFunction(); 
} 

我想這些應該工作。

+0

是的,非常感謝! – dif 2014-10-11 03:58:51

相關問題