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