C ++ Array Constructor - PullRequest
       11

C ++ Array Constructor

5 голосов
/ 22 декабря 2009

Мне было просто интересно, может ли член массива класса быть создан сразу после создания класса:

class C
{
      public:
          C(int a) : i(a) {}

      private:
          int i;
};

class D
{
 public:
        D() : a(5, 8) {}
        D(int m, int n) : a(m,n) {}

     private:
     C a[2];

};

Насколько я мог судить, создание массива в Конструкторе, например, в C ++, невозможно. В качестве альтернативы, элемент массива может быть инициализирован в блоке Constructor следующим образом.

class D
    {
     public:
         D() { 
               a[0] = 5;
               a[1] = 8; 
             }
         D(int m, int n) { 
                           a[0] = m;
                           a[1] = n; 
                         }
         private:
         C a[2];

    };

Но тогда, это больше не создание массива, а присвоение массива. Элементы массива создаются компилятором автоматически через конструктор по умолчанию, а затем они вручную присваиваются определенным значениям в блоке C'tor. Что раздражает; для такого обходного пути класс C должен предлагать конструктор по умолчанию.

У кого-нибудь есть идеи, которые могут помочь мне в создании элементов массива при конструировании. Я знаю, что использование std :: vector может быть решением, но из-за условий проекта мне не разрешено использовать любую стандартную библиотеку, библиотеку Boost или стороннюю.

Ответы [ 2 ]

5 голосов
/ 22 декабря 2009

Массивы - концепция, более старая, чем сам C ++, унаследованная непосредственно от C - на самом деле не имеют конструкторов, которые можно было бы использовать, как вы заметили. Вам остается несколько обходных путей, учитывая те странные ограничения, о которых вы упоминаете (нет стандартной библиотеки?!?!?) - вы можете иметь a указатель на C, а не массив C, выделите для него необработанную память, затем инициализируйте каждого члена с помощью «размещения нового» (что решает проблему с C, по крайней мере, с конструктором по умолчанию).

1 голос
/ 22 декабря 2009

Вы можете создать класс, чтобы обернуть массив и конструировать, как вам нравится. Вот начало; этот код не проверен, кроме того, что вы видите.

#include <iostream>
using namespace std;

template< class T, int N >
struct constructed_array {
        char storage[ sizeof( T[N] ) ]; // careful about alignment
        template< class I >
        constructed_array( I first ) {
                for ( int i = 0; i < N; ++ i, ++ first ) {
                        new( &get()[i] ) T( *first );
                }
        }
        T *get() const { return reinterpret_cast< T const* >( storage ); }
        T *get() { return reinterpret_cast< T * >( storage ); }
        operator T *() const { return get(); }
        operator T *() { return get(); }
};

char const *message[] = { "hello", ", ", "world!" };

int main( int argc, char ** argv ) {
        constructed_array< string, 3 > a( message );
        for ( int i = 0; i < 3; ++ i ) {
                cerr << a[i];
        }
        cerr << endl;
        return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...