Как определить размер вектора-члена в конструкторе класса?

Сначала я хочу создать вектор без размера ( vector<int> times), а позже я хочу определить его размер в конструкторе класса ( times(size) ).

Я могу сделать это, используя список инициализаторов, как показано ниже.

class A (int size): times(size) {};

Но мой вопрос в том, почему я не могу сделать это в конструкторе вне класса, как в приведенном ниже коде?

Я имею в виду, почему приведенный ниже код неверен?

class A
{
public:
    A(int size);
private:
    std::vector<int> line;
};

A::A(int size)
{
    line(size);// here I got the error
}

line(size) сделать ошибку

Написанная вами версия выглядит так, как будто вы пытаетесь вызвать функцию с именем line с одним параметром size. Неудивительно, что компилятор запутается.

john 12.07.2019 08:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
248
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать функцию-член std::vector::resize для этого

A::A(int size)
{
    line.resize(size);
}

Член line будет построен по умолчанию (т. е. std::vector<int> line{}) до того, как достигнет тела конструктора. И поэтому писать line(size); не имеет смысла, следовательно ошибка компилятора.

Гораздо лучше было бы использовать списки инициализаторов членов, который поможет чтобы построить вектор из переданного размера и инициализировать с помощью 0 , прежде чем достичь тела конструктора.

A(int size) : line(size) {}

Он использует следующий конструктор std::vector

explicit vector( size_type count );   // (since C++11)(until C++14)
explicit vector( size_type count, const Allocator& alloc = Allocator() ); // (since C++14)

Вероятно, вы захотите использовать список инициализаторов:

A::A(int size) : line(size)
{ }

или назначьте новое значение для line:

A::A(int size)
{
  this->line = std::vector(size);
}

Эти два параметра вставят size элементов в вектор. Таким образом, вектор будет заполнен значениями по умолчанию. Если вы хотите убедиться, что достаточно места для вставки такого количества элементов в более поздний момент времени, используйте резерв для увеличения емкости уже построенного вектора:

A::A(int size)
{
  this->line.reserve(size);
}

Уточнение

Если вы используете первый или второй вариант, line.size() и line.capacity() будут равны size, потому что в вектор были вставлены элементы по умолчанию.
С третьим вариантом элементы по умолчанию не будут вставлены, поэтому line.size() будет 0, а line.capacity() будет size.

Обратите внимание, что reserve делает что-то совершенно отличное от двух других вариантов! resize может быть более подходящим?

BoBTFish 12.07.2019 08:12

Я отредактировал свой ответ, но не стесняйтесь редактировать его, если я недостаточно ясен :)

churill 12.07.2019 08:23

Код неверен, потому что вы попытались повторно инициализировать в теле вашего конструктора вектор, который уже был инициализирован до размера 0.

Измените код конструктора, чтобы использовать список инициализаторов.

A::A(int size)
  : line(size)
{
}

Другие вопросы по теме