Сначала я хочу создать вектор без размера ( 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) сделать ошибку





Вы можете использовать функцию-член 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 может быть более подходящим?
Я отредактировал свой ответ, но не стесняйтесь редактировать его, если я недостаточно ясен :)
Код неверен, потому что вы попытались повторно инициализировать в теле вашего конструктора вектор, который уже был инициализирован до размера 0.
Измените код конструктора, чтобы использовать список инициализаторов.
A::A(int size)
: line(size)
{
}
Написанная вами версия выглядит так, как будто вы пытаетесь вызвать функцию с именем
lineс одним параметромsize. Неудивительно, что компилятор запутается.