2015-04-01 23 views
1

我正在创建一个需要书店库存的程序,并且每个单独的项目(如ISBN和作者)都位于名为Books的结构中。由于这个清单中会有多本书,我想创建一个Books结构体的数组。由于外部需求超出了我的控制范围,结构定义必须位于我的类所在的头文件中,并且结构数组必须在main()中声明。如何在结构定义位于头文件中时在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()。需要注意的是它可以让我创建一个从结构书籍的变量,而不是一个数组:

#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元素的可变长度数组 type'Books' Books booklist [MAX_SIZE];

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

+0

如果你得到一个关于非POD元素类型的错误,您正在使用C++,不C. – 2015-04-01 04:35:13

+0

我认为,在C++中,不能将variable_name作为VLA的数组大小。它必须是一个常量'int max = 100; int a [max];'不允许,而'#define max 100 int a [max];'应该很好 – Gopi 2015-04-01 04:38:41

回答

1

申报MAX_SIZE作为一个const int和它应该工作。问题是编译时必须知道数组的大小(它必须是一个编译时间常量)。 int可以在运行时更改,而const int(或define)不可以。

0

关于VLA

  • 如果你的代码是C++(这个问题)

据我所知,没有什么C++标准作为VLA的支持。也许std::vector将有所帮助。

解决方案:对于这段代码,你可以改变int MAX_SIZE = 100#define声明,如#define MAX_SIZE 100或使const intMAX_SIZE


  • 如果你的代码是C(正如前面的标签)

注意点:根据你的代码,Books不是数据类型,struct Books是。在你的代码

  • 使用typedef struct Books Books;

    • 使用struct Books然后用Books正如您在您的代码中使用:

      所以,请使用以下。

    另外,就标准而言,VLA是在C99标准中引入的。您必须通过提供--std=c99gcc来满足标准。

  • +0

    代码是C++,而不是C - 见证头文件,使用命名空间标准符号等等。 ,这个问题曾经用C标记过,但那是一个错误。) – 2015-04-01 04:44:25

    +1

    我会在C材料之前加上'###'这样的子标题,并且'###如果你的代码是C++ '在C++材料之前,但代码已经是C++,所以C信息虽然准确,但并不真正相关。 C++的建议是可以的。 – 2015-04-01 04:47:53

    +0

    请注意,在C++中,'Books'是'struct books {'已被解析的类型。你的开篇段落是你C语言的一部分。 – 2015-04-01 04:57:04

    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 
    
    +0

    虽然'MAX_SIZE'不是一个常量整数,这将无济于事。 – 2015-04-01 04:44:01

    0

    就CONVER以下行来定义

    int MAX_SIZE = 100 
    

    因此,解决办法是

    #define MAX_SIZE 100 
    
    +2

    呃! 'const int MAX_SIZE = 100;'会更好; 'enum {MAX_SIZE = 100};'会更好。避免在C++中使用#define。 – 2015-04-01 04:40:56

    0

    低于
    一个有些指针。我认为这是一个错字,头文件必须包含#endif声明。 b。要在堆栈上创建阵列,阵列大小必须为const,请尝试将MAX_SIZE更改为const int MAX_SIZE = 100

    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_SIZEconst int MAX_SIZE = 100。您不能创建类型为Books的VLA,因为string成员具有构造函数(不是POD - 普通旧数据类型),因此Books类型的构造函数非常重要。

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

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

    或使用:

    std::vector<Books> booklist; 
    
    0

    如果你不使用的typedef,U需要指定类型struct <struct_name>

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