在c++中的继承类中声明构造函数时出错



我得到了两个类,Person和Student,其中Person是基类,Student是派生类。不允许对Person类或主函数进行任何更改。。注意Student继承了Person的所有属性。一个Student类构造函数,它有参数:字符串,名字字符串,姓氏一个整数,id。一个测试分数的整数数组(或向量(。char calculate((方法,该方法计算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;
}

Person没有默认构造函数,因此必须在mem初始值设定项列表中的类Student的构造函数中显式调用具有类型为Person的子对象参数的构造函数。

构造函数可以按照以下方式查看

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) {
...
}

最新更新