Инициализаторы массивов объёктов

  • Автор темы Ramozarti
  • Дата начала
R

Ramozarti

Гость
#1
Как быть, например когда нужно инициализировать в конструкторе массив однотипных элементов-объектов.

Описание класса:

class Car {
private:
const Wheel wheels[4];
const Engine engine;
const double length;
int color;
public:
Car (double wheelSize, double plength, int pcolor);
setColor (int color);
};

Конструктор:

этот код не работает, почему???

Car::Car (double wheelSize, double plength, int pcolor)
: wheels[0](wheelSize), wheels[1](wheelSize), wheels[2](wheelSize),
wheels[3](wheelSize)
,length(plength) {
color = pcolor;
cout << "Car::Car, length = " << length << ", color " << color << endl;
}

С++ Builder выдаёт ошибки:

[C++ Error] car.cpp(14): E2276 ( expected
[C++ Error] car.cpp(14): E2444 Member 'Car::wheels' is initialized more than once
[C++ Error] car.cpp(14): E2276 ( expected
[C++ Error] car.cpp(14): E2444 Member 'Car::wheels' is initialized more than once
[C++ Error] car.cpp(14): E2276 ( expected
[C++ Error] car.cpp(15): E2444 Member 'Car::wheels' is initialized more than once
[C++ Error] car.cpp(15): E2276 ( expected
[C++ Error] car.cpp(15): E2279 Cannot find default constructor to initialize member 'Car::wheels'


Что нужно сделать, чобы этот код заработал? Или что перписать?
--------------------------

Уже нашёл ответ

Добавим в объявление нашего класса объявление массива. Инициализация массива-члена класса при определении объекта не вызывает особых проблем (здесь следует вспомнить раздел, посвящённый массивам-параметрам). Однако в C++ отсутствует возможность инициализации нестатического константного массива-члена класса. Так что можно не стараться выписывать подобные объявления:

const int xx[2]; // Бессмысленное объявление.

всё равно массив xx[2] невозможно проинициализировать. Все варианты инициализации константного нестатического массива будут отвергнуты.

ComplexType():xx(1,2) {/*…*/};
ComplexType():xx({1,2}) {/*…*/};
ComplexType():xx[0](1), xx[1](2) {/*…*/};

Согласно БНФ, в состав инициализатора могут входить только имена или квалифицированные имена. Для обозначения элемента массива этого недостаточно. Как минимум, здесь требуется выражение индексации, которое указывало бы номер элемента массива.

И всё же выход из такой ситуации существует. Можно объявить константный указатель на константу, которому в выражении инициализации можно присвоить имя ранее определённого массива:

:::::
const int DefVal[2] = {1,2};
class ComplexType
{
:::::
const int const * px;
/* Объявили константный указатель на константу. */
:::::
ComplexType():Px(DefVal) {/*…*/};
:::::
};

Окольными путями мы всё же достигаем желаемого результата. Константный указатель на константу контролирует константный массив.