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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Ramozarti, 12 июн 2008.

  1. Ramozarti

    Ramozarti Гость

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

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

    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) {/*…*/};
    :::::
    };

    Окольными путями мы всё же достигаем желаемого результата. Константный указатель на константу контролирует константный массив.
     
Загрузка...
Похожие Темы - Инициализаторы массивов объёктов
  1. lmike
    Ответов:
    9
    Просмотров:
    1.587
  2. qwe123qqe
    Ответов:
    0
    Просмотров:
    914
  3. Dazzel
    Ответов:
    1
    Просмотров:
    947
  4. Thrillseeker
    Ответов:
    1
    Просмотров:
    1.262
  5. Yammy
    Ответов:
    1
    Просмотров:
    1.037

Поделиться этой страницей