我想先创建一个没有大小(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
}
出错
答案 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)
{
}