[英]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.