2014-10-11 4 views
-1

Как создать несколько экземпляров классов без индивидуальной печати их имен?Как создать несколько экземпляров класса в C++

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

Take 'MyCLASS MyInstance [я];' ** из ** тела цикла, объявляющего его выше для петли, как 'MyCLASS MyInstance [10];' If вы ищете способ передать различные значения для построения массива для каждого члена, вы не будете легко делать это так (и на самом деле может быть проблемой * реального *, которую вы пытаетесь решить) , – WhozCraig

+0

Вы компилируете с полными предупреждениями?Использовать '-Wall -Wextra -pedantic' и возможность выбора новейшего стандарта C++ тоже не будет ошибкой. Затем компилятор должен громко жаловаться на ваш код. – Deduplicator

+1

IMO и со всем уважением: вам действительно нужно прочитать хорошую книгу на C++. –

ответ

1

Как создать несколько экземпляров классов без индивидуального ввода их имен?

Ответ вы делаете массив, но не так, как вы пробовали.

Как это:

int main() 
{ 
    MyClass myInstance[10]; 

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

TIP: Не используйте массивы, используйте std::vector или std::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-контейнере, лучше всего используйте подходящую посадку: 'std :: array'. Во всяком случае, работает и массив raw. – Deduplicator

+0

+ Я думаю, что это очень вероятно, что это действительно цель OP: другое значение для каждой * конструкции * последовательности элементов. – WhozCraig

+0

Ваш код не будет компилироваться, если целое число 'i' не может быть отправлено в myClass. Я не знаю, кто проголосовал за ваш ответ. –

-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 значения


Edit для фиксации проблемы с кодом выше. Уже предложены лучшие решения.

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

+2

Вы не компилируете код. –

+0

@ Jarod42: Вместо необработанных указателей владения правильная альтернатива - это умные указатели, верно? Хотя любое динамическое распределение в этом случае не подходит. – Deduplicator

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

Смежные вопросы