Поля родительского класса не распознаны

У меня возникла проблема на некоторое время, когда я пытаюсь унаследовать от чисто виртуального класса, когда я делаю конструктор для классов «son», я получаю эту ошибку:

../src/Course.cpp:54:77: error: class ‘ElectiveCourse’ does not have any field named ‘_dptr’

И это происходит для всех полей Защищенных полей.

Это структура:

Course.h:

    class Course{
public:
virtual void reg(Student * s) = 0;
..
protected:
...
string _dptr;
...
};

а потом:

class ElectiveCourse : public Course{
...
}

Course.cpp:

ElectiveCourse::ElectiveCourse(
string name,
int semester,
double minGrade
)
: _dptr("CS"), _name(name), _semester(semester), _minGrade(minGrade) {
}

Как и ElectiveCourse, у меня есть два других класса, которые наследуются от класса Course, и я получаю одинаковую ошибку во всех них.
[РЕДАКТИРОВАТЬ] Это происходит только в конструкторе из них.
В классе Course нет НИКАКОГО конструктора, следовательно, он чисто виртуальный.

С другой стороны, у меня также есть два класса: Student и CSStudent: Student, где Student также является чисто виртуальным, а CSStudent наследует Student, и в этом случае ошибок нет. Я сделал то же самое в обоих из них.
В чем проблема?
Я прошу прощения за мои грамматические ошибки.

[РЕДАКТИРОВАТЬ] добавил часть Course.cpp, где я получаю сообщение об ошибке.

Спасибо!

1

Решение

Вы не можете инициализировать переменные-члены одного класса в другом классе. Если вы хотите инициализировать переменные-члены Course в конструкторе, вы должны добавить конструктор в Course. Вы можете сделать этот конструктор защищенным, если хотите.

Альтернативой (вероятно, лучше) было бы изменить ваш дизайн, чтобы сделать Course интерфейсом.

3

Другие решения

Вы не можете инициализировать поля вашего родительского класса в конструкторе подкласса. Причина этого в том, что порядок построения включает в себя конструкцию базового класса, прежде чем вы сможете фактически обратиться к его внутренним полям. А строительство базы требует строительства ее внутренних полей. Тем не менее, чтобы достичь того, что вам нужно, вы должны создать конструктор в базовом классе, который принимает все ваши параметры (имя, семестр и т. Д.), И вызвать этот конструктор из конструктора подкласса:

Course::Course(string name,
int semester,
double minGrade):
_dptr("CS"),
_name(name),
_semester(semester),
_minGrade(minGrade){}

ElectiveCourse::ElectiveCourse(string name,
int semester,
double minGrade):
Course(name, semester, minGrade){}
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector