Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Конструктор массива классов

#cpp #массивы


Есть класс корабль, по-умолчанию он инициализируется параметром, который содержит
в себя информацию о количестве палуб. Я пытаюсь инициализировать массив, вызвав конструктор,
вот так:

Ship ship[SHIP_COUNT](DECK_X4);


Этот код естественно не проходит. И нельзя создать у него метод SetDeck, потому что
это будет перечить логике создания кораблей (иначе размер можно будет менять постоянно).

Как можно создать массив класса, вызвав при этом для каждого элемента массива конструктор?
    


Ответы

Ответ 1



Если вы уж пишете на C++, я бы посоветовал отказаться от сишных массивов, и пользоваться нормальными контейнерами. Для std::vector: std::vector ship; ship.reserve(SHIP_COUNT); for (int i = 0; i < SHIP_COUNT; i++) ship.emplace_back(DECK_X4); Уточнение: как подсказывает @alexolut, в проектах RAD Studio есть возможность переключаться между старым и новым компиляторами (опция classic compiler в свойствах проекта). Стандарт C++11 поддерживается лишь новым компилятором, поэтому если в проекте используется старый, нужно воспользоваться push_back(Ship(DECK_X4)); вместо emplace_back.

Ответ 2



Если значение SHIP_COUNT не велико, то вы могли бы указать инициализатор для каждого элемента массива либо как Ship ship[SHIP_COUNT] = { DECK_X4, DECK_X4, /*...*/, DECK_X4 }; если конструктор является преобразующим конструктором, либо как Ship ship[SHIP_COUNT] = { Ship( DECK_X4 ), Ship( DECK_X4 ), /*...*/, Ship( DECK_X4 ) }; если конструктор объявлен со спецификатором explicit. Иначе вам потребуется объявить конструктор по умолчанию с аргументом по умолчанию, как, например, Ship( TypeOfDeck value = DECK_X4 ); Либо вы можете использовать контейнер std::vector следующим образом: std::vector ship( SHIP_COUNT, DECK_X4 ); Или std::vector ship( SHIP_COUNT, Ship( DECK_X4 ) ); опять-таки в зависимости от того, объявлен ли конструктор со спецификатором функции explicit или без него.

Ответ 3



Т.к количество палуб является неизменной величиной, то использование std::vector избыточно и совершенно не нужно. С другой стороны, использование обычного статического массива не удобно, поэтому на выручку приходит std::array который обладает всеми преимуществами стандартного контейнера, при этом оставаясь незименяемым: #include #include int main(int argc, char** argv) { //... std::array ship; std::fill(ship.begin(), ship.end(), DECK_X4); //... return 0; }

Комментариев нет:

Отправить комментарий