如何創建多個類實例而不需要單獨鍵入他們的名字?如何在C++中創建一個類的多個實例
int main(){
myClass myInstance_1;
myClass myInstance_2;
myClass myInstance_3;
...
myClass myInstace_10;
}
如何創建多個類實例而不需要單獨鍵入他們的名字?如何在C++中創建一個類的多個實例
int main(){
myClass myInstance_1;
myClass myInstance_2;
myClass myInstance_3;
...
myClass myInstace_10;
}
如何創建多個類實例,而無需單獨鍵入其名稱?
答案是你做的陣列,而不是你嘗試過的方式。
像這樣:
int main()
{
MyClass myInstance[10];
for(int i = 0; i < 10; i++)
{
myInstance[i].myClassFunction();
}
}
提示:不要使用數組,使用std::vector
或std::array
。
(見從@ Jarod42回答)
你可以做到以下幾點:
int main(){
std::vector<myClass> myInstances;
for(int i = 0; i < 10; ++i) {
myInstances.emplace_back(i);
}
myInstances[5].myClassFunction();
}
如果你堅持使用std-container,最好使用適合的配置:'std :: array'。無論如何,一個原始數組也可以工作。 – Deduplicator 2014-10-11 00:56:06
+我認爲這很可能是OP的目標:元素序列的每個*構造的不同值。 – WhozCraig 2014-10-11 00:56:14
你的代碼不會編譯,除非整數'i'可以被轉換成myClass。我不知道是誰投了你的答案。 – 2014-10-11 00:59:00
使用數組:
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];
}
避免原始擁有指針,而是使用'std :: vector'。 (並且你錯過了一個BTW指針)。 – Jarod42 2014-10-11 00:56:47
你的代碼不會編譯。 – 2014-10-11 00:58:00
@ Jarod42:而不是原始的擁有指針,正確的選擇是智能指針,對吧?儘管在這種情況下任何動態分配都不行。 – Deduplicator 2014-10-11 00:58:07
解決方案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();
}
就像Jarod42代碼:
int main(){
std::vector<myClass> myInstances;
for(int i = 0; i < 10; ++i) {
myInstances.push_back(myClass(i));
}
myInstances[5].myClassFunction();
}
我想這些應該工作。
是的,非常感謝! – dif 2014-10-11 03:58:51
採取'myClass的將myInstance [I];'** **出循環體,宣佈它的for循環爲'myClass的將myInstance [10]以上的;'如果你正在尋找一種方法將不同的值傳遞給每個成員的數組構造,你不會輕易地這樣做(事實上可能是你正試圖解決的*真實*問題) 。 – WhozCraig 2014-10-11 00:51:58
你有完整的警告編譯嗎?使用'-Wall -Wextra -pedantic'和一個選項來選擇最新的C++標準也不會是不妥的。然後編譯器應該大聲抱怨你的代碼。 – Deduplicator 2014-10-11 00:55:01
IMO和所有的尊重:你真的需要閱讀一本好的C++書籍。 – 2014-10-11 00:57:37