2012-11-18 3 views
1

저는 잠시 동안 문제가 생겼습니다. 순수 가상 클래스에서 상속하려고 할 때 "아들"클래스의 생성자를 만들 때이 오류가 나타납니다 :부모 클래스 필드가 인식되지 않습니다.

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

그리고 이것은 모든 코스 보호 필드에 대해 발생합니다. 나는 ElectiveCourse처럼

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

: 다음

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

과 :

Course.h :

class ElectiveCourse : public Course{ 
... 
} 

Course.cpp

은 구조 두 가지 다른 클래스가있다. Course 클래스에서 상속 받으면 모든 클래스에서 같은 오류가 발생합니다. [편집] 이것은 생성자에서만 발생합니다. Course 클래스에는 생성자가 없으므로 순수 가상입니다.

다른 한편으로는 학생과 CSStudent : Student라는 두 개의 classe도 있습니다. 여기서 Student는 순수 가상이고 CSStudent는 Student를 상속하며이 경우에는 오류가 없습니다. 나는 그들 모두에서 똑같은 일을했다. 무엇이 문제입니까? 문법 오류로 유감입니다.

[편집] 오류가 발생하는 Course.cpp 부분을 추가했습니다.

감사합니다.

+0

후 실제 관련을 : 그것은 당신이, 당신이 당신의 매개 변수 (이름, 학기 등)을 모두 수용하여 기본 클래스의 생성자를 만들고 하위 클래스 생성자에서이 생성자를 호출 할 필요 달성했다 암호. 맞춤법을 수정하십시오 – SomeWittyUsername

+1

"Course 클래스에는 생성자가 없으므로 순수 가상입니다." 왜 순수 가상 클래스에는 생성자가 없어야합니까? 순수 가상은 객체를 생성하기 전에 먼저 클래스에서 파생되어야한다는 것을 의미합니다. 그러나 이러한 객체의 "기본"부분은 여전히 ​​생성되어야하며,이를 위해 생성자가 필요할 수도 있습니다. – JohnB

+0

Btw, C++에서 모든 클래스에는 생성자가 있습니다. 명시 적으로 선언하지 않으면 컴파일러에서 기본 생성자를 추가합니다. 당신이 할 수있는 유일한 일은 생성자를 protected 나 private으로 선언함으로써 외부 세계의 생성자에 대한 접근을 제한하는 것입니다. 그래서 당신의 "순수 가상"클래스는 생성자 (디폴트 생성)와 공개 된 생성자를 가지고 있습니다! – JohnB

답변

2

다른 클래스의 한 클래스의 멤버 변수를 초기화 할 수 없습니다. 생성자에서 Course의 멤버 변수를 초기화하려면 생성자를 Course에 추가해야합니다. 원하는 경우 해당 생성자를 보호 할 수 있습니다.

대안 (아마 더 나은)은 코스를 인터페이스로 만들기 위해 디자인을 변경하는 것입니다.

2

하위 클래스 생성자에서 상위 클래스의 필드를 초기화 할 수 없습니다. 그 이유는 실제로 내부 필드를 처리 할 수 ​​있기 전에 기본 순서의 생성을 포함하는 것입니다. 그리고 기지의 건설은 그것의 내부 필드의 건설을 필요로합니다.

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){} 
+0

감사합니다. 그것은 일했다! – Javi

관련 문제