Как инициализировать массив объектов параметризованного конструктора - PullRequest
3 голосов
/ 14 февраля 2012

Мне нужно инициализировать массив объектов параметризованного конструктора.Как я могу сделать это наилучшим образом?

   # include<iostream>
   # include<conio.h>
   # include<stdio.h>

   using namespace std;

   class A
   {
    public:
    int a;       
    A();
    A(int x)
    {
     a=x;
    }      
   };
   int main()
   {
    A *a1,a2(1);
    a1 = (A*)malloc(sizeof(A)*10); // equivalent to A[10]. 
    for(int i=0;i<10;i++) a1[i]=a2; // Initialization is important in any program.
    for(int i=0;i<10;i++) cout<<a1[i].a; 
    getch(); 
    return 0;   
   }

Это работает, но есть ли другой способ лучше, чем этот?

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

C ++ мог бы использовать std :: vector.

std::vector<A>   a1(10, 1);

создает инициализированные 10 A значения 1.

0 голосов
/ 14 февраля 2012

Обратите внимание, что malloc не создает объекты, и поэтому вызов a1[i]=a2 является плохой формой.Вероятно, , кажется, работает нормально, поскольку они являются объектами POD-ish, но это не правильный способ сделать C ++.Это неопределенное поведение, которое совершенно непредсказуемо.Это может работать десять тысяч раз подряд, а затем стереть ваш банковский счет.Вместо этого вы должны использовать new, который также создает.Или еще лучше, используйте вектор, как предлагают другие ответы.Кроме того, убедитесь, что конструктор по умолчанию инициализирует данные, и инициализация будет меньше беспокоить.

Если вы действительно должны использовать malloc, «правильный способ» инициализации таков:

std::uninitialized_copy(a1, a1+10, a2); //constructs and assigns

, что примерно эквивалентно:

{
    int i=0;
    try {
        for(i=0; i<10; ++i)
           new(a1+i)A(a2); //constructs and initializes in the buffer
    } catch(...) { 
        try {
            for(; i>=0; --i)
               (a1+i)->~A(); //destroy if an error occured
        } catch(...) { 
            std::terminate();
        }
        throw;
    }
}
0 голосов
/ 14 февраля 2012

Это решается с помощью конструктора std :: vector с размером и базовым элементом:

A a2(1);
std::vector<A> tab(10, a2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...