Кажется, в этом потоке есть общая суть, что вы не можете инициализировать элементы массива, кроме как с помощью конструктора по умолчанию. Один ответ даже создает другой тип, просто чтобы вызвать другой конструктор. Даже если вы можете (, если массив не является частью класса! ):
struct foo {
foo(int a): a(a) { }
explicit foo(std::string s): s(s) { }
private:
int a;
std::string s;
};
/* global */
foo f[] = { foo("global"), foo("array") };
int main() {
/* local */
foo f[] = { 10, 20, 30, foo("a"), foo("b") };
}
Тип, однако, должен быть способен к копированию: данные элементы инициализируются копией для элементов массива.
Для массивов в качестве членов классов лучше всего использовать контейнеры на данный момент:
struct bar {
/* create a vector of 100 foo's, initialized with "initial" */
bar(): f(100, foo("initial")) { }
private:
std::vector<foo> f;
};
Использование метода placement-new
, описанного andy.gurin, также возможно. Но учтите, что это все усложнит. Вам придется вызывать деструкторов самостоятельно. И если какой-либо конструктор выдает, пока вы все еще создаете массив, вам нужно выяснить, где вы остановились ... В целом, если вы хотите иметь массивы в своем классе и хотите их инициализировать, используйте std::vector
простая ставка.