2016-05-29 8 views
3

私には問題があります。それを解決する良い方法を見つける手助けをすることができます。たとえば、私は2つの構造を持っています。学生と教師の両方に同じフィールド「名前」があります。私は学生や教師を渡すことができる関数を記述したいと思います。関数に構造体を渡すには?

struct student 
{ 
    char name[25]; 
    unsigned int grade; 
}; 

struct teacher 
{ 
    char name[25]; 
    unsigned int salary[25]; 
}; 

機能はそのようなことのようになります -

void findAPersonNamedJohn(anyStruct &struct) { 
    for (int i; i < structCount; i++) 
    if (!strcmp(struct[i].name, "John")) 
     cout << "Found him!"; 
} 

質問です:私は何とか、この機能を提供しています、または2つの機能を行うための唯一の方法である1つの機能書くことができます - 学生のための1をし、教師のための1。

おかげ

+2

なぜ名前を格納するのにchar []配列を使用しますか? C++では100倍の便利な 'std :: string'を使うことができました。また、私は給料が数字だと仮定して、なぜあなたはそれのための文字列型を使用していますか? – LibertyPaul

+0

@LibertyPaul、yes - 文字列が意味をなさない、ありがとう!給与は私の側では単なるエラーです、私はそれを修正します。 私はチャーを離れるので、人々は答えを変える必要はありません。 – Deniss

答えて

7

あなたはテンプレート関数のいずれかを使用することができます:あなたが使用する必要がある場合には、状況の完璧な例です

struct Base { 
    char name[25]; 
}; 

struct student: Base { 
    unsigned int grade; 
}; 

struct teacher: Base { 
    char salary[25]; 
}; 

void findAPersonNamedJohn(const Base **structs, int structCount) { 
    for (int i=0; i < structCount; i++) 
     if (!strcmp(structs[i]->name, "John")) 
      cout << "Found him!"; 
} 
+0

いいえ!基本クラスの例は未定義の振る舞いであり、可能な限り完全に間違っています。無意味な場合、テンプレートは正しいです。 – Puppy

+0

定義されていない動作はどのくらい正確ですか?あなたはどんな種類の継承も未定義の動作であることを暗示していますか? – user975989

+0

@Puppy Right、スライス。上からコピー&ペーストする。更新しました。 – skypjack

2

:彼らのために

template<typename T> 
void findAPersonNamedJohn(const T *structs, int structCount) { 
    for (int i=0; i < structCount; i++) 
     if (!strcmp(structs[i].name, "John")) 
      cout << "Found him!"; 
} 

または共通の基本クラスをinheritance。あなたは同じフィールドを持つ2クラス(または構造)をお持ちの場合は、基本クラスにこれらのクラスからこの部分を移動し、そこからの両方を継承することができます

struct human{ 
    char name[25]; 
}; 

struct student : public human 
{ 
    unsigned int grade; 
}; 

struct teacher : public human 
{ 
    char salary[25]; 
}; 

だから、両方studentteacherはフィールドname

を持ち、

void findAPersonNamedJohn(const human &human) { 
    if (!strcmp(human.name, "John")) 
     cout << "Found him!"; 
} 

この関数には、実際のオブジェクトタイプについてのヒントはありません。それが知っているのは、タイプがhumanのものが渡されたことだけです。

int main(){ 

    student s1; 
    strcpy(s1.name, "John"); 
    s1.grade = 1; 

    teacher t1; 
    strcpy(s1.name, "Alice"); 
    s1.grade = 2; 

    findAPersonNamedJohn(s1); 
    findAPersonNamedJohn(t1); 
} 
+0

'char salary [25]' ...... – WhatsUp

+0

@WhatsUp作者コードです。なぜ文字列に数字を格納するのが悪いのかは別の質問の話題です。 – LibertyPaul

+0

いいえ、これはひどく未定義の動作です。 – Puppy

関連する問題