Brace-initialization работает для всех видов конструкторов, и в этом случае вам не нужен аргумент конструктора списка инициализаторов. Напротив, списки инициализаторов предназначены для переменной содержимого, подобно содержимому динамического контейнера, но не для аргументов конструктора фиксированной длины. Так что вы можете просто сказать:
vector3D v { 1, 1, 1 };
и все будет хорошо.
Обратите внимание, что вы действительно должны инициализировать своих учеников, а не назначать их:
Vector3D(float xx, float yy, float zz = 0.0) : x(xx), y(yy), z(zz) { }
Vector3D(const float v[]) : x(v[0]), y(v[1]), z(v[2]) { }
Вы также не должны писать конструктор копирования, так как он не лучше, чем тот, который предоставляется по умолчанию. То же самое касается оператора присваивания.
(Лично я не чувствую себя комфортно с конструктором float[]
; было бы лучше использовать std::array<float, 3>
; но опять же, вы можете просто использовать такой массив как ваш 3D-векторный тип с самого начала и вообще не надо писать собственный класс.)
Наконец, вы можете объединить construct-initializer-lists и initializer-list-constructors в этом последнем примере создания списка векторов:
std::list<Vector3D> l { { 1.0, 2.0, 3.0}, { 1.5, 3.0, 4.4 }, { 0.0, -1.2, 4.1 } };