2012-11-01 48 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; }(类型安全,如传递指针不会产生错误的值,但不能编译) –

相关问题