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