Конструктор Array C++

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

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++. С другой стороны, участник массива может быть инициализирован в блоке Конструктора следующим образом.

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 должен предложить конструктора по умолчанию.

Имеет кого-либо любая идея, которая может помочь мне в создании участников массива на конструкцию. Я знаю что использование станд.:: вектор мог бы быть решением, но, из-за условий проекта мне не разрешают использовать стандарт, Повышение или стороннюю библиотеку.

5
задан avakar 22 December 2009 в 08:16
поделиться

2 ответа

Массивы -- понятие более старое, чем сам С++, унаследованное прямо от С -- на самом деле нет пригодных для использования конструкторов, как вы, по сути, заметили. Есть несколько обходных путей, которые остались бы для вас, учитывая странные ограничения, которые вы упоминаете (нет стандартной библиотеки?!?!) -- вы могли бы иметь a указатель на C, а не массив C, выделить ему сырую память, а затем инициализировать каждый член "placement new" (что работает вокруг проблемы отсутствия конструктора по умолчанию на C, по крайней мере)

.
5
ответ дан 14 December 2019 в 13:38
поделиться

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

#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;
}
1
ответ дан 14 December 2019 в 13:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: