如何在类的构造函数中定义成员向量的大小?

时间:2019-07-12 06:03:40

标签: c++ class c++11 constructor stdvector

我想先创建一个没有大小(single quote mark)的向量,然后稍后在类(vector<int> times)的构造函数中定义其 size 。 / p>

我可以使用下面显示的初始化列表进行操作

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 } 出错

3 个答案:

答案 0 :(得分:7)

您可以为此使用成员函数std::vector::resize

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

成员line将在到达构造函数的主体之前被默认构造(即std::vector<int> line{})。因此,写line(size);没有任何意义,因此 编译器错误。

最好使用member initializer lists,这会有所帮助 从传递的大小构造向量,并在到达构造函数主体之前用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)

答案 1 :(得分:3)

您可能要使用initializer list

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

或将new value分配给line

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

这两个选项会将size元素插入向量。因此,矢量将使用默认值填充。如果仅要确保有足够的空间在以后的某个时间点插入许多元素,请使用reserve来增加已经构造的向量的容量:

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

澄清

如果您使用第一个或第二个选项line.size(),并且line.capacity()将等于size,因为默认元素已插入到向量中。
使用第三个选项时,不会插入默认元素,因此line.size()将为0,而line.capacity()size

答案 2 :(得分:1)

代码错误,因为您试图在构造函数的主体中重新初始化已经初始化为大小为0的向量。

更改构造函数代码以使用初始化列表

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