如何将任何结构传递给函数?

时间:2016-05-29 20:18:23

标签: c++ struct

我有一个问题,也许你可以帮我找到解决问题的好方法。例如,我有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!";
}

问题是:我可以以某种方式编写提供此功能的1个功能,或者是制作2个功能的唯一方法 - 1个用于学生,1个用于教师。

由于

2 个答案:

答案 0 :(得分:7)

您可以使用模板功能:

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!";
}

或者是他们的共同基类:

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!";
}

答案 1 :(得分:2)

当您应该使用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);
}