2012-11-01 85 views
0

我正在嘗試編寫一個函數,該函數作用於結構數組中的成員,該結構是另一個結構:)的成員。我需要做的第一件事是找出結構數組的長度,但我不斷得到錯誤expression must be class type.如何確定另一個結構內部的結構數組的長度

什麼是適當的方式來獲得這個數組的長度? (PS功能必須採取Student結構作爲參數。)

的結構:

struct Class 
{ 
    string title; 
    int units; 
    char grade; 

}; 
struct Student 
{ 
    string name; 
    double gpa; 
    Class classes[500]; 
}; 

我的功能看起來是這樣的:

void gpaCalculate (Student s) 
{ 
    int size = s.classes.size() ; 
    //Lots of awesome code 
} 
+0

對於固定大小的數組使用'std :: array',否則通常使用'std :: vector'。兩者都有'size'成員函數。數組是內置的,所以他們沒有任何成員或任何東西。 – chris

+0

如果您確實需要按照該問題編碼,請將幻數500設爲常量「MAX_CLASSES」或類似的值。正如克里斯指出的,有更好的解決方案。實際的問題是你試圖在本地數組上調用'size()'(實際上沒有方法) – John3136

+0

通過const引用傳遞's'也可能會有好處。 – chris

回答

3

代碼

struct Student 
{ 
    string name; 
    double gpa; 
    Class classes[500]; 
}; 

表明Student可以參加到最大500班,並認爲這是一些學校的作業,你期望/使用原始陣列需要,而不是另有更合適std::vector

首先,幻數 500應做出一個恆定的,就像這樣:

int const maxClasses = 500; 

然後在每個Student對象,你需要存儲類的實際數量這名學生就讀於:

struct Student 
{ 
    string name; 
    double gpa; 
    int nClasses; 
    Class classes[maxClasses]; 

    Student() 
     : name(), gpa(0.0), nClasses(0), classes() 
    {} 
}; 

構造函數確保gpanClasses將歸零。

因爲它們是內置類型,否則不能保證(根據你不支付你不使用的原則,所以它的你的決定)。

+0

Nitpick;即使基元靜態分配,它們也會被清零。 +1 –

0

如果你所改變的結構到C++類?然後你可以創建一個函數來訪問Classes數組的大小。您可以輕鬆地將gpaCalulate函數作爲Class類的函數調用。

+0

您可以爲'struct'創建函數,而不必更改爲'class'。但問題仍然存在:您無法確定存儲在'class' /'struct'中的數組的大小。 – jogojapan

1

在回答這個問題:「我如何確定數組的長度是多少?」,用(sizeof(array)/sizeof(*array)),如

void gpaCalculate (Student s) 
{ 
    int size = (sizeof s.classes)/sizeof(*s.classes); 
    //Lots of awesome code 
} 

注:這不會變長數組參數的工作。 在回答「我應該如何在C++中存儲項目列表」的問題時,通常應該使用一個向量。向量比數組更容易處理。例如,與數組不同的向量可以改變大小。

+3

順便說一句,在C++ 11中這樣做的類型安全方式是:'template constexpr size_t array_size(T(&)[N]){return N; }(類型安全,如傳遞指針不會產生錯誤的值,但不能編譯) –

相關問題