C++ 定义与常量int绑定的数组无效

C++ 定义与常量int绑定的数组无效,c++,c++17,C++,C++17,我想根据文本文件中的行数初始化数组,以便将文本数据读入程序,但结构有问题。到目前为止,我知道我需要用一个常量来定义数组边界,我已经尝试过了,但是我得到的错误是,我没有用积分常量表达式来定义数组边界,尽管我相信这就是我正在做的 我正在使用g++编译我的代码,使用C++17标准。下面我只包含了相关代码 //tools.h int findMaxID() { std::ifstream fin("\data\items.txt"); char ch; in

我想根据文本文件中的行数初始化数组,以便将文本数据读入程序,但结构有问题。到目前为止,我知道我需要用一个常量来定义数组边界,我已经尝试过了,但是我得到的错误是,我没有用积分常量表达式来定义数组边界,尽管我相信这就是我正在做的

我正在使用g++编译我的代码,使用C++17标准。下面我只包含了相关代码

//tools.h

int findMaxID()
{
    std::ifstream fin("\data\items.txt");
    char ch;
    int z = 1;
    while(fin)
    {
        fin.get(ch);
        if(ch == '\n')
            z++;
    }
    return z;
}
const int MaxID = findMaxID();

// data.h

#include"tools.h"

struct ItemData
{
    public:
        unsigned int ID[::MaxID];
        char Name[::MaxID][32];
        char Type[::MaxID][8]; 
};

我不知道该怎么办。我已经尝试了所有的方法,我尝试了使用向量而不是数组,但是我发现在多维使用它的时候会很尴尬和困惑,我尝试了使用一个指向值的指针。也许是我设置错了。我所知道的是,我已经尽了最大的努力来克服这个问题,但这个问题似乎不是我能解决的。我希望您能在这个问题上帮助我。

在设计数据结构时,请先考虑单个案例:

struct ItemData
{
公众:
无符号整数ID;
std::字符串名;
std::字符串类型;
};
然后分别对这些结构进行骨料处理:

std::向量项;

通过读取数据并对其进行解析,您可以非常轻松地使用
emplace\u back
向其中添加条目。

数组大小必须是编译时常量。

在这种情况下,您的大小变量在运行时取该值,标准禁止该


为了解决这个问题,尝试使用C++工具,如Cux> STD::String 数组,以及其他类型数组的代码<:/<代码>。< /P>不能在编译时确定,因此它不能在这样的数组中使用。在C++中使用<代码> STD::向量< /COD>数组和<代码> STD::String < /C> >而不是字符数组。什么是“尴尬和困惑”?它们在使用上与C数组完全相同,如果事先适当调整大小,或者如果进行扩展,则需要根据需要
向后推
向后放置
。请参阅非常适用的答案。[tl;dr]数组大小必须是一个编译时常量。编译器的诊断是完全自解释的。C++中的数组维数必须是常数表达式(在编译时进行评估)。代码>常量int MaxID=findMaxID()不会导致在编译时调用和计算
findMaxID()
。它只是防止初始化后更改
MaxID
。要使用
MaxID
作为数组维度,必须使用可在编译时计算的常量表达式对其进行初始化(例如
const int MaxID=10
)。这是否回答了您的问题?
data.h:15:21: error: size of array 'ID' is not an integral constant-expression
   15 |   unsigned int ID[::MaxID];
      |                   ~~^~~~~
data.h:16:15: error: size of array 'Name' is not an integral constant-expression
   16 |   char Name[::MaxID][32];
      |             ~~^~~~~
data.h:17:15: error: size of array 'Type' is not an integral constant-expression
   17 |   char Type[::MaxID][8];