0

我有两个类,Person 和 Student,其中 Person 是基类,Student 是派生类。不允许对 Person 类或 main 函数进行任何更改。请注意,Student 继承了 Person 的所有属性。一个学生类构造函数,它有参数:一个字符串,名字一个字符串,姓一个整数,id。测试分数的整数数组(或向量), 。char calculate() 方法,计算学生对象的平均值并返回代表其计算平均值的成绩字符。样本输入-

Heraldo Memelli 8135627 2 100 80

预期输出-

Name: Memelli, Heraldo ID: 8135627 Grade: O

我得到的错误是在声明构造函数时,你能解释一下为什么吗?还有其他你会建议的方法吗?提前致谢。这是我的代码-

    #include <iostream>

    #include <vector>

    using namespace std;
    class Person {
      protected:
        string firstName;
      string lastName;
      int id;
      public:
        Person(string firstName, string lastName, int identification) {
          this - > firstName = firstName;
          this - > lastName = lastName;
          this - > id = identification;
        }
      void printPerson() {
        cout << "Name: " << lastName << ", " << firstName << "\nID: " << id << "\n";
      }
    };
    class Student: public Person {
      private: vector < int > testScores;
      public: Student(string firstName, string lastName, int identification, vector < int > & scores) {
        for (int i = 0; i < & scores.size(); i++)
          this - > testScores.pushback( & scores[i]);
      }
      char calculate() {
        int avg, sum = 0, count = 0;
        for (int i = testScores.begin(); i < testScores.size(); i++) {
          sum = sum + testScores[i];
          count++;
        }
        avg = sum / count;
        if (avg >= 90 && avg <= 100)
          return ('O');
        else if (avg >= 80 && avg < 90)
          return ('E');
        else if (avg >= 70 && avg < 80)
          return ('A');
        else if (avg >= 55 && avg < 70)
          return ('P');
        else if (avg >= 40 && avg < 55)
          return ('D');
        else if (avg0 < 40)
          return ('T');
      }
    };
    int main() {
      string firstName;
      string lastName;
      int id;
      int numScores;
      cin >> firstName >> lastName >> id >> numScores;
      vector < int > scores;
      for (int i = 0; i < numScores; i++) {
        int tmpScore;
        cin >> tmpScore;
        scores.push_back(tmpScore);
      }
      Student * s = new Student(firstName, lastName, id, scores);
      s - > printPerson();
      cout << "Grade: " << s - > calculate() << "\n";
      return 0;
    }
4

2 回答 2

0

The class Person does not have the default constructor, So you have to call the constructor with parameters of the sub-object of the type Person explicitly in the constructor of the class Student in the mem-initializer list.

The constructor can look the following way

Student( const std::string &firstName, 
         const std::string &lastName, 
         int identification, 
         const std::vector<int> &scores ) 
         : Person( firstName, lastName, identification ), testScores( scores )
{
} 

And the member function can be defined like

  char calculate() const
  {
    long long int sum = 0;

    for ( const auto &item : testScores )
    {
        sum += item;
    }

    long long int avg = testScores.size() == 0 ? 0 : sum / testScores.size();

    char c;

    if ( avg >= 90 )
      c = 'O';
    else if ( avg >= 80 )
      c = 'E';
    else if ( avg >= 70 )
      c ='A';
    else if ( avg >= 55 )
      c = 'P';
    else if ( avg >= 40 )
      c = 'D';
    else
      c = 'T';

    return c;
  }

As for your code then for example this loop

    for (int i = 0; i < & scores.size(); i++)
      this - > testScores.pushback( & scores[i]);

is invalid and shall not be compiled at least because you are trying to take the address of an rvalue returned by the member function size.

于 2020-04-29T18:45:00.780 回答
0

我认为很明显,您希望您的 Student 对象是一个具有给定名称等的人,但是您的代码在哪里说呢?,firstName和参数未使用lastNameidentitfication这就是你应该如何去做

Student(string firstName, string lastName, int identification, vector < int > & scores) : 
    Person(firstName, lastName, identification) {
    ...
}
于 2020-04-29T18:56:06.180 回答