非常数数组

时间:2017-06-30 17:38:31

标签: c++ arrays

我正在尝试使用类对象创建一个数组,并且数组大小可能会有所不同。我正在做的是在Visual Studio 2015上使用C ++创建“库”,信息来自文本文件。该文件的第一行包含书籍数量,我有程序读取第一行并将其设置为整数变量。我试图将一个常量整数设置为等于前一个整数的大小,但是当我尝试创建数组时,它告诉我它不是常数。

int numBooks;
    inputfile >> numBooks;

    const int SIZE = numBooks;
    Library records[SIZE]; //"Expression must have a constant value"

我需要做些什么才能让它发挥作用。书籍的数量会发生变化,数组的大小也会发生变化。

3 个答案:

答案 0 :(得分:4)

不要使用原始数组。必须在编译时知道原始数组的大小。请改用std::vector

int numBooks;
inputfile >> numBooks;
std::vector<Library> records(numBooks);

您可能无法告诉矢量初始大小。告诉它与每个项目一起成长:

int numBooks;
inputfile >> numBooks;
std::vector<Library> records;
// ...
records.push_back(book);

另请注意,Library是此类的错误名称。它可能应该被称为Book

答案 1 :(得分:1)

const int SIZE = numBooks;

必须在编译时初始化,因此无法对其进行初始化。

最好的选择是使用std::vector

size_t numBooks;
cin >> numBooks;
std::vector<Library> records(numBooks);

注意:

@Christian Hacklanswer所述的内容相反,在许多情况下(特别是用户定义的类型),最好使用以下内容:

size_t numBooks;
cin >> numBooks;
std::vector<Library> records;
records.reserve(numBooks);

并使用std::vector::emplace_back();

添加元素
std::vector<Library> records(numBooks);

会调用Library numBooks次的默认构造函数,之后您会通过复制操作等操作向量元素。

std::vector::emplace_back()允许将新构造的Library记录直接移动到向量,std::vector::reserve()将保证不需要进行内存重新分配(这可能会成为代价高昂的性能)。

对于从文件中读取的大量记录,绝对值得考虑。

答案 2 :(得分:0)

SIZE的值,因此在运行时之前不会初始化数组的大小,因此这不符合C ++的工作原理。

初始化数组时,必须指定固定的实数整数值。

否则使用矢量。