我正在创建一个程序来获取书店库存,每个单独的项目(如ISBN和作者)都在名为Books的结构中。由于此库存中将有多本书,我想创建一个Books结构的数组。由于我无法控制的外部要求,结构定义必须位于我的类所在的头文件中,并且必须在main()中声明结构数组。
这是头文件functions.h中的结构定义:
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <iostream>
#include <string>
using namespace std;
struct Books
{
int ISBN;
string Author;
string Publisher;
int Quantity;
double Price;
};
现在我尝试在main()中创建结构数组。请注意,它允许我从struct Books创建变量,但不能创建数组:
#include <iostream>
#include <string>
#include <fstream>
#include "functions.h"
using namespace std;
int main()
{
int MAX_SIZE = 100, size, choice;
functions bookstore;
Books novels;
Books booklist[MAX_SIZE];
}
当我这样做时,我收到以下编译器错误
bookstore.cpp:11:16:错误:非POD元素的可变长度数组 类型&#39;书籍&#39; 图书清单[MAX_SIZE];
为什么在尝试从外部结构声明结构数组时会出现这样的错误,而不是来自同一外部结构的变量?
答案 0 :(得分:2)
C ++标准不支持可变长度数组。如果您需要可变长度数组功能,请改用vector<Books>
。
G ++允许VLA作为标准C ++的扩展。但是,您不能用C语言初始化VLA,也不能用G ++的C ++方言初始化。因此,VLA的元素不能具有(非平凡的)构造函数。并且错误消息告诉您:
variable length array of non-POD element type 'Books' Books booklist[MAX_SIZE];
您有VLA,因为MAX_SIZE
不是const int MAX_SIZE = 100
。您无法创建Books
类型的VLA,因为string
成员具有构造函数(不是POD - 普通旧数据 - 类型),因此对于类型{{1}有一个非平凡的构造函数}}
最简单的解决方法是使用:
Books
或使用:
const int MAX_SIZE = 100;
int size;
int choice;
答案 1 :(得分:1)
在声明结构的同时,你必须这样做。
struct Books booklist[MAX_SIZE];
或者在headerfile
中创建typedef。
typedef struct Books
{
int ISBN;
string Author;
string Publisher;
int Quantity;
double Price;
}Books;
将MAX_SIZE
的值设为这样。
#define MAX_SIZE 100
答案 2 :(得分:1)
将MAX_SIZE声明为const int,它应该可以工作。问题是必须在编译时知道数组的大小(它必须是编译时常量)。可以在运行时更改int,而const int(或define)不能。
答案 3 :(得分:0)
关于VLA:
C++
(此问题) AFAIK,C++
标准中没有任何内容可用作VLA支持。也许std::vector
会有所帮助。
解决方案:对于此代码,您可以将int MAX_SIZE = 100
更改为#define
语句,例如#define MAX_SIZE 100
或更改类型MAX_SIZE
const int
。
C
(如前所述) 注意事项:根据您的代码,Books
不是数据类型,struct Books
是。
所以,请使用以下任一方法:
struct Books
typedef struct Books Books;
,然后使用您在代码中使用的Books
。此外,就C
标准而言,VLA是在C99
标准中引入的。您必须通过--std=c99
提供gcc
来确定标准。
答案 4 :(得分:0)
只需转换以下行来定义
int MAX_SIZE = 100
所以解决方案就是
#define MAX_SIZE 100
答案 5 :(得分:0)
下面的一些指示
一个。我认为这是一个错字,头文件必须包含#endif
语句
湾要在堆栈上创建数组,数组大小必须为const
,请尝试将MAX_SIZE
更改为const int MAX_SIZE = 100
。
答案 6 :(得分:0)
如果您没有使用typedef,则需要将类型指定为struct <struct_name>
int main()
{
int MAX_SIZE = 100, size, choice;
struct Books novels;
struct Books booklist[MAX_SIZE];
}