如何在方法中传递结构参数

How do you pass struct parameters in a method

本文关键字:结构 参数 方法      更新时间:2023-10-16

我没有找到我问题的答案,我对 OOP 很陌生,所以请怜悯我。 好的,所以我有以下代码:

class Group
{
public:
struct Student
{
char name[40],
int grades[5]};
}
Student s[10];
.....
private: double med(???)
{
.....
}
}

那么???在哪里我想将个别学生的成绩作为参数,并返回他们的平均值。我不知道我应该如何声明它们,我尝试了很多方法,但每次都出错。

很多

所以你有一个带有参数的结构,比如:

struct Student
{
std::string name;
std::array<int, 5> grades;
};

由于这被标记为C++,我选择使用std::array<int, 5>而不是int[5]

在我看来,Student不一定在Group内部,但我想这是基于意见的。

现在,您有一个包含学生的Group

struct Group
{
Group(std::vector<Student> students) :
_students{ std::move(students) }
{}
double med(/* ... */) const
{ /* ... */ }
std::vector<Student> _students; // C++ -> use std::vector
};

假设你想传递特定学生的成绩作为函数med的参数,而不是简单地这样做:

double Group::med(const std::array<int, 5>& grades) const
{ /* sum up grades, divide by 5, and return the result */ }

您将按如下方式调用此函数:

Student paul{"Paul", {1,2,3,4,5}};
Group group({paul});
group.med(paul.grades);

正如评论中所建议的,您可能希望传递学生的姓名而不是他/她的成绩:

double med(const std::string& name)
{
// find student
auto it = std::find_if(_students.begin(), _students.end(), [&name](const Student& student)
{
return student.name == name;
});
// if no student by that name
if (it == _students.end())
return -1.0;
// else    
int sum{ 0 };
for (const auto& grade : it->grades)
{
sum += grade;
}
return static_cast<double>(sum)/(it->grades.size());
}

以下是关于好C++书籍的讨论。

Tyr 此代码包含四个 avg(( 函数,它们都相同,但在调用函数的方式上有所不同。

#include<iostream>
#include<string.h>
using namespace std;
class Group
{
public:
struct Student
{
char name[40];
int grades[5];
}student;
double avg()
{
double sum=0;
for(int i=0;i<5;i++)
sum+=student.grades[i];
return (sum/5);
}
};
double avg(int *grade)
{
double sum=0;
for(int i=0;i<5;i++)
sum+=grade[i];
return (sum/5);
}
double avg(Group::Student stduent)
{
double sum=0;
for(int i=0;i<5;i++)
sum+=stduent.grades[i];
return (sum/5);
}
double avg(Group group)
{
double sum=0;
for(int i=0;i<5;i++)
sum+=group.student.grades[i];
return (sum/5);
}
int main()
{
Group group1;
strcpy(group1.student.name,"MyName");
for(int i=0;i<5;i++)
group1.student.grades[i]=5;
cout<<"Name:"<<group1.student.name<<endl;
cout<<"Avg:"<<avg(group1.student.grades)<<" "<<avg(group1.student)<<" "<<avg(group1)<<" "<<group1.avg();
return 0;
}

输出:

Name:MyName
Avg:5 5 5 5
Process returned 0 (0x0)   execution time : 0.379 s
Press any key to continue.

您可以保留未命名的结构,例如

struct
{
char name[40];
int grades[5];
}student;

如果从代码中删除函数和函数调用

double avg(Group::Student stduent)
{
double sum=0;
for(int i=0;i<5;i++)
sum+=stduent.grades[i];
return (sum/5);
}