В С++ невозможно инициализировать элементы массива в списке инициализации, поэтому объекты-члены должны иметь конструкторы по умолчанию, и они должны быть правильно инициализированы в конструкторе. Существует ли (разумное) обходное решение для этого, кроме использования массивов?
[Все, что может быть инициализировано с использованием только списка инициализации, в нашем приложении гораздо предпочтительнее использовать конструктор, поскольку эти данные могут быть выделены и инициализированы компилятором и компоновщиком, и каждый цикл тактового сигнала ЦП рассчитывается даже до main
. Однако не всегда возможно иметь конструктор по умолчанию для каждого класса, и, кроме того, повторная инициализация данных снова в конструкторе все равно побеждает цель.]
например. Я хотел бы иметь что-то вроде этого (но это не работает):
class OtherClass {
private:
int data;
public:
OtherClass(int i) : data(i) {}; // No default constructor!
};
class Foo {
private:
OtherClass inst[3]; // Array size fixed and known ahead of time.
public:
Foo(...)
: inst[0](0), inst[1](1), inst[2](2)
{};
};
Единственным обходным решением, о котором я знаю, является не массив:
class Foo {
private:
OtherClass inst0;
OtherClass inst1;
OtherClass inst2;
OtherClass *inst[3];
public:
Foo(...)
: inst0(0), inst1(1), inst2(2) {
inst[0]=&inst0;
inst[1]=&inst1;
inst[2]=&inst2;
};
};
Изменить: Следует подчеркнуть, что OtherClass
не имеет конструктора по умолчанию и что очень желательно, чтобы компоновщик мог выделить любую необходимую память (один или несколько статических экземпляров Foo
), используя кучу, по существу, verboten. Я обновил приведенные выше примеры, чтобы выделить первую точку.