Ошибка при объявлении конструктора в унаследованном классе в C ++ - PullRequest
0 голосов
/ 29 апреля 2020

Мне дали два класса, Person и Student, где Person - базовый класс, а Student - производный класс. Любые изменения в классе Person или главной функции не допускаются. Обратите внимание, что Student наследует все свойства Person. Конструктор класса Student, имеющий параметры: строка, имя, строка, фамилия, целое число, идентификатор. Целочисленный массив (или вектор) результатов тестов. Метод char calc (), который вычисляет среднее значение объекта Student и возвращает знак оценки класса, представляющий их вычисленное среднее значение. Пример ввода -

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

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я думаю, что совершенно очевидно, что вы ожидаете, что вашим объектом Student будет человек, которому присвоено имя и т.д. c, но где в вашем коде вам это сказано? Параметры firstName, lastName и identitfication не используются. Вот как ты должен к этому

Student(string firstName, string lastName, int identification, vector < int > & scores) : 
    Person(firstName, lastName, identification) {
    ...
}
0 голосов
/ 29 апреля 2020

Класс Person не имеет конструктора по умолчанию, поэтому вы должны вызвать конструктор с параметрами подобъекта типа Person явно в конструкторе класса Student в mem-initializer list.

Конструктор может выглядеть следующим образом

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

Что касается вашего кода, то, например, это l oop

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

недопустим и не должен компилироваться хотя бы потому, что вы пытаетесь получить адрес значения, возвращаемого функцией-членом size.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...