2015-04-01 22 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]; 
    }