当struct定义在头文件中时,如何在main()中创建一个结构数组?

时间:2015-04-01 04:32:20

标签: c++ arrays struct header-files

我正在创建一个程序来获取书店库存,每个单独的项目(如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];

为什么在尝试从外部结构声明结构数组时会出现这样的错误,而不是来自同一外部结构的变量?

7 个答案:

答案 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];
}