在 C++ 中的 Inherited class 中声明构造函数时出错

Error while declaring constructor in an Inherited class in c++

我得到了两个 classes,Person 和 Student,其中 Person 是基础 class,Student 是派生的 class。不允许对 Person class 或 main 函数进行任何更改。观察 Student 继承了 Person 的所有属性。一个 Student class 构造函数,它有参数:一个字符串,一个字符串,一个姓氏,一个整数,id。测试分数的整数数组(或向量),. char calculate() 方法计算 Student 对象的平均值和 returns 表示其计算平均值的成绩字符。示例输入 -

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

classPerson没有默认构造函数,所以必须在Person类型的子对象的构造函数中显式调用带参数的构造函数内存初始化器列表中的 class Student

构造函数可以看下面的方式

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

并且成员函数可以这样定义

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

至于你的代码,例如这个循环

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

无效且不应编译,至少因为您正试图获取成员函数 size 返回的右值的地址。

我认为很明显您希望您的 Student 对象是一个具有给定名称等的人,但是您在代码中的什么地方这么说了? firstNamelastNameidentitfication 参数未使用。这是你应该如何做的

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