如何在C++中创建一个类的多个实例
如何创建多个类实例而不需要单独键入他们的名字?如何在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