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

How to create an array of structs in main() when struct definition is in a header file?

我正在创建一个获取书店库存的程序,每个单独的项目(如 ISBN 和作者)都在一个名为 Books 的结构中。由于此清单中会有多本书,因此我想创建一个 Books 结构数组。由于我无法控制的外部要求,结构定义必须在我的 class 所在的头文件中,并且结构数组必须在 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() 中创建结构数组。请注意,它允许我从结构 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 元素的可变长度数组 输入 'Books' 图书清单[MAX_SIZE];

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


关于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标准而言,C99标准中引入了VLA。您必须通过提供 --std=c99gcc.

来执行标准

在声明结构时,您必须这样给出。

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

只需转换以下行来定义

int MAX_SIZE = 100

所以解决方案是

#define MAX_SIZE 100

下面的一些提示
一种。我认为这是一个错字,头文件必须包含#endif语句。
b.要在堆栈上创建数组,数组大小必须为 const ,请尝试将 MAX_SIZE 更改为 const int MAX_SIZE = 100.

C++ 标准不支持可变长度数组。如果您需要可变长度数组功能,请改用 vector<Books>

G++ 允许 VLA 作为标准 C++ 的扩展。但是,您不能在 C 中或在 G++ 的 C++ 方言中初始化 VLA。所以 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 — 普通旧数据 — 类型),因此类型 [=16 有一个非平凡的构造函数=].

最简单的解决方法是使用:

    const int MAX_SIZE = 100;
    int size;
    int choice;

或使用:

std::vector<Books> booklist;

将 MAX_SIZE 声明为 const int,它应该可以工作。问题是数组的大小必须在编译时已知(它必须是编译时常量)。 int 可以在运行时更改,而 const int(或定义)不能。

如果您不使用 typedef,您需要将类型指定为 struct <struct_name>

int main()
{
    int MAX_SIZE = 100, size, choice;
    struct Books novels;
    struct Books booklist[MAX_SIZE];
}