1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

  1. Ramozarti

    Ramozarti Гость

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

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

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

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

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