0

I have been given two classes, Person and Student, where Person is the base class and Student is the derived class. Any change in Person class or main function is not allowed.. Observe that Student inherits all the properties of Person. A Student class constructor, which has parameters: A string, first name A string, last name An integer, id. An integer array (or vector) of test scores, . char calculate() method that calculates a Student object's average and returns the grade character representative of their calculated average. Sample Input-

Heraldo Memelli 8135627 2 100 80

Expected Output-

Name: Memelli, Heraldo ID: 8135627 Grade: O

Error which I am getting is while declaring constructor can you please explain me why and is there any other approach which you would suggest. Thanks in advance. Here's my code-

    #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;
    }
Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335

2 Answers2

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.

Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335
0

I think it's pretty clear that you are expecting your Student object to be a person which the given name etc, but where in your code to you say that? The firstName, lastName and identitfication parameters are unused. Here's how you should to it

Student(string firstName, string lastName, int identification, vector < int > & scores) : 
    Person(firstName, lastName, identification) {
    ...
}
john
  • 85,011
  • 4
  • 57
  • 81