繁体   English   中英

非常数数组

[英]Non-Constant Array

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

int numBooks;
    inputfile >> numBooks;

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

我需要在这里做什么才能使其正常工作。 书籍的数量将改变,数组的大小也必须改变。

不要使用原始数组。 原始数组的大小必须在编译时知道。 使用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

const int SIZE = numBooks;

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

最好的替代方法是使用std::vector

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

注意:

@Christian Hackl回答相反,在许多情况下(尤其是对于用户定义的类型),最好使用以下方式:

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记录直接移动到vector,而std::vector::reserve()将保证无需进行内存重新分配(这可能会导致性能损失) 。

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

SIZE的值以及数组的大小直到运行时才被初始化,因此这与C ++的工作方式不符。

初始化数组时,必须分配一个固定的实整数值。

否则使用vector。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM