2014-10-11 150 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

相关问题