B b[]
здесь " гибкий элемент массива ", нестандартное расширение в вашем компиляторе (взято из C99), которое позволяет вам объявить неограниченный массив как последний член в типе. Это полезно только при выделении вашего объекта старомодным способом C (когда вы добавляете аргумент к malloc
, чтобы освободить место для массива), и его следует избегать. В этом случае вы не не выделили никакой дополнительной памяти для массива, поэтому в вашем теле конструктора, когда вы пытаетесь получить доступ к чему-то, что происходит через 3 «элемента» после этого небытия, вы вызываете UB , Я проигнорирую расширение до конца моего ответа, так как оно действительно не имеет места в коде C ++.
Нет ли способа указать размер массива внутри конструктора?
Нет, нет.
Границы массива должны быть известны во время компиляции, поэтому ни в одном случае вы не знаете больше в своем теле ctor, чем в определении класса; Вы должны записать измерение в самом объявлении члена:
class A {
B b[3];
};
Если измерение является величиной времени выполнения в вашей программе, вам нужно вместо этого сохранить указатель и в конструкторе указать его на динамический блок памяти:
class A {
public:
A() : b(new B[3]) {}
~A() { delete[] b; }
private:
B* b; // same as `B b[]`! but far clearer
};
Вместо этого я предлагаю std::vector
:
class A {
public:
A() : b(3) {}
private:
std::vector<B> b;
};