我正在尝试使用类对象创建一个数组,并且数组大小可能会有所不同。我正在做的是在Visual Studio 2015上使用C ++创建“库”,信息来自文本文件。该文件的第一行包含书籍数量,我有程序读取第一行并将其设置为整数变量。我试图将一个常量整数设置为等于前一个整数的大小,但是当我尝试创建数组时,它告诉我它不是常数。
int numBooks;
inputfile >> numBooks;
const int SIZE = numBooks;
Library records[SIZE]; //"Expression must have a constant value"
我需要做些什么才能让它发挥作用。书籍的数量会发生变化,数组的大小也会发生变化。
答案 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 Hackl中answer所述的内容相反,在许多情况下(特别是用户定义的类型),最好使用以下内容:
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 ++的工作原理。
初始化数组时,必须指定固定的实数整数值。
否则使用矢量。