【问题标题】:Non-Constant Array非常量数组
【发布时间】:2017-12-04 17:59:18
【问题描述】:

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

int numBooks;
    inputfile >> numBooks;

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

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

【问题讨论】:

标签: c++ arrays


【解决方案1】:

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

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

否则使用向量。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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);
      

      会调用LibrarynumBooks 次的默认构造函数,然后你会通过复制操作等操作向量元素。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-21
        • 2016-11-16
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多