我有一个问题,也许你可以帮我找到解决问题的好方法。例如,我有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个用于教师。
由于
答案 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];
};
因此,student
和teacher
都会有字段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);
}