С2512. Person: нет подходящего конструктора по умолчанию.E0291.для класса"Person" не существует конструктор по умолчанию
Как исправить ошибки С2512 и E0291,строка 29?
#include<iostream>
using namespace std;
class Person
{
protected:
string name;
string surname;
public:
Person(string n, string s)
{
name = n;
surname = s;
}
void Print(Person p)
{
cout << "Name - " << name << endl;
cout << "Surname - " << surname << endl;
}
~Person();
};
class Student:public Person
{
protected:
string specialty;
double grade;
public:
Student(string s,double g){
specialty = s;
grade = g;
}
~Student();
};
int main()
{
Person* per = new Person("name", "surname");
return 0;
}
Ответы (1 шт):
В вашем конструкторе Student
Student(string s,double g){
specialty = s;
grade = g;
}
не указан вызов конструктора базового класса, а значит, в качестве такового будет использован конструктор по умолчанию Person::Person(). У вас такого нет, и сгенерировать его компилятор не может - поскольку есть Person::Person(string n, string s). Что компилятору остается, кроме как жаловаться на жизнь?...
Вы должны либо добавить конструктор по умолчанию Person::Person(), либо переписать
Student(string s,double g):Person(?,?) {
Здесь ? - какие-то аргументы типа string, ну, а какие и откуда их брать - это уж думайте сами исходя из своей задачи... Вы сейчас создаете безымянного студента - это намек.
И еще - не надо эти присваивания в конструкторе, используйте инициализацию:
Person(string n, string s):name(n),surname(s){}
И снова - зачем вам копировать лишний раз строки? Передавайте их по ссылке:
Person(const string& n, const string& s):name(n),surname(s){}
То же относится и к Student.
И кстати, а где же тело деструктора? Если деструктор ничего особого делать не должен - или пишите
~Person(){};
или
~Person() = default;
а то при линковке будут проблемы, если соберетесь память освободить. И это замечание относится и к Student тоже.
Дальше смотреть не буду, а то ответ никогда не закончу :)