0

別の構造体のメンバーである構造体の配列にある構造体のメンバーに作用する関数を作成しようとしています:)。最初に行う必要があるのは、構造体の配列の長さを調べることですが、エラーが発生し続けますexpression must be class type.

この配列の長さを取得する適切な方法は何でしょうか? (追伸。関数は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
}
4

3 に答える 3

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()
    {}
};

gpaコンストラクターは、 andnClassesがゼロになることを保証します。

それらは組み込み型であるため、それ以外の場合は保証されません (使用しないものには料金を支払わないという原則に従って、それはあなたの決定です)。

于 2012-11-01T02:54:11.470 に答える
1

「配列の長さを決定するにはどうすればよいですか?」という質問に答えるには、次のようにを使用します(sizeof(array) / sizeof(*array))

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

注:これは、可変長配列パラメーターでは機能しません。「アイテムのリストをC++で保存するにはどうすればよいですか」という質問に答えるには、通常、ベクトルを使用する必要があります。ベクトルは、配列よりも操作しやすい傾向があります。たとえば、配列とは異なり、ベクトルはサイズを変更できます。

于 2012-11-01T03:26:21.783 に答える
0

構造を C++ クラスに変更したらどうなるでしょうか。次に、クラスの配列のサイズにアクセスする関数を作成できます。Class クラスの関数として gpaCalulate 関数を簡単に呼び出すことができます。

于 2012-11-01T02:52:41.040 に答える