2012-11-18 46 views
1

我已經benn有一段時間的問題,當我試圖從純虛類繼承,當我做「兒子」類的構造函數我收到此錯誤:父類的字段不被識別

../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類繼承,並且我在它們中都得到相同的錯誤。 [編輯]這隻發生在他們的構造函數。 課程中沒有構造函數,因此它是純虛擬的。

另一方面,我也有兩個類:Student和CSStudent:Student,其中Student也是純虛擬的,CSStudent繼承Student,在這種情況下沒有錯誤。我在他們倆都做了同樣的事情。 什麼似乎是問題? 我很抱歉我的語法錯誤。

[編輯] 添加Course.cpp部分,我得到錯誤。

謝謝!

+0

後真正相關碼。並更正拼寫 – SomeWittyUsername

+1

「課程中沒有任何構造函數,因此它是純虛擬的。」爲什麼純虛擬類不應該有構造函數?純粹的虛擬只意味着你必須從類中依次派生,然後才能從中創建對象 - 但是,這些對象的「基礎」部分仍然需要構造,並且可能需要構造器。 – JohnB

+0

順便說一下,在C++中,每個類都有一個構造函數。如果你不明確聲明一個,編譯器會添加一個默認的構造函數。你唯一能做的就是通過聲明一個構造函數protected或private來限制從外部世界訪問構造函數。所以你的「純虛擬」類有一個構造函數(默認生成的),甚至是一個公共的! – JohnB

回答

2

您不能在另一個類中初始化一個類的成員變量。如果要在構造函數中初始化課程的成員變量,則必須向課程添加構造函數。如果你喜歡,你可以使構造函數受到保護。

替代方案(可能更好)是改變你的設計,使課程成爲一個界面。

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