【问题标题】:How do you pass struct parameters in a method如何在方法中传递结构参数
【发布时间】:2020-05-21 11:09:53
【问题描述】:

我在任何地方都找不到我的问题的答案,我对 OOP 还很陌生,所以请原谅我。 好的,我有以下代码:

class Group
{
public:
    struct Student
    {
        char name[40],
        int grades[5]};
    }

    Student s[10];

    .....

    private: double med(???)
    {
        .....
    }
}

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

很多

【问题讨论】:

  • 你的 Student 结构用 Group 类包裹。所以你需要创建一个类对象,然后才能使用它
  • 您确定要通过学生的成绩,而不仅仅是姓名吗?这样你就可以做到group.med("Suzy")(对应的原型是double med(const char * name))。当然,如何处理不存在的学生取决于您,也许返回 -1 是个好主意。
  • 公平地说,将原始数组传递给函数的语法可能有点奇怪,这也是建议改用std::arraystd::vector 的原因之一。如果你真的坚持使用原始数组,你需要像double med(int (&grades)[5])这样的东西。
  • @Botje 学生们不是不存在的。我有他们所有的姓名和成绩,我只需要返回每个学生的平均成绩。作为唯一的参数,我应该有 s[i].notes[5] 但我在语法部分遇到了麻烦。我不知道,也找不到针对这种特殊情况的任何答案。
  • 如果你想通过成绩,你为什么不这样做呢?或者您在尝试这样做时遇到了什么问题?

标签: c++ oop methods struct parameters


【解决方案1】:

此代码包含四个 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);
}

【讨论】:

    【解决方案2】:

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

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

    由于标记为C++,因此我选择使用std::array&lt;int, 5&gt; 而不是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);
    

    根据 cmets 的建议,您可能希望传递学生的姓名而不是他/她的成绩:

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

    Here 是关于优秀 C++ 书籍的讨论。

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多