Search code examples
c++inheritancevectorconstructorctor-initializer

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


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

Solution

  • 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.