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

6

我希望先创建一个没有大小限制的向量(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
3个回答

7

您可以使用成员函数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)

3
您可能想使用一个初始化器列表(initializer list):
A::A(int size) : line(size)
{ }

或者给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


1
请注意,reserve与其他两个选项的作用非常不同!resize可能更合适? - BoBTFish
我修改了我的回答,如果我表达不清楚,请随意编辑它 :) - Lukas-T

2

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

更改您的构造函数代码以使用初始化程序列表。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接