1

我有一個非常簡單的父子關係,其中OlderSon從父繼承和家長有一個指針指向他OlderSon,如:C++。孩子從父母繼承,幷包括父屬性

#ifndef PARENT_HXX 
#define PARENT_HXX 

#include <iostream> 
#include <string>  
//#include "OlderSon.hxx" 

class OlderSon; 

class Parent 
{ 
private : 
    OlderSon* _os; 
public :   
    int _age; 
    std::string _name; 

    Parent(){ 
     _name="parent name"; 
     _age=60; 
     //OlderSon* _os=new OlderSon(); 
    } 
}; 

#endif //PARENT_HXX 

和兒子:

#ifndef OLDERSON_HXX 
#define OLDERSON_HXX 

#include <iostream> 
#include <string> 
#include "Parent.hxx" 


class OlderSon: public Parent 
{ 
public: 
    OlderSon(){ 
     _age=25; 
     _name="Olderson name"; 
    } 


}; 

#endif //OLDERSON_HXX 

但是每當我試圖以取消在指針被初始化OlderSon* _os=new OlderSon();我得到一個錯誤信息行:

Parent.hxx: In constructor ‘Parent::Parent()’: 
Parent.hxx:25:31: error: invalid use of incomplete type ‘struct OlderSon’ 
Parent.hxx:8:7: error: forward declaration of ‘struct OlderSon’ 

我嘗試了不同的方式,即包括.hxx或前向聲明,但似乎沒有任何幫助。我想這不是一個非常複雜的問題,但它開始令人沮喪。
任何想法?
在此先感謝!

+0

你的兒子是父母嗎?我想也許你應該有一個Person類的基類,並且Person實例和其他的Person類實例組合起來形成族。 – Dennis 2012-04-17 10:48:16

+0

嗨,現在你指出了兒子/父母的概念沒有多大意義。不過,我試圖將名稱更改爲「父/子」以更清楚地解釋它。實際上,這些類是Factory方法的一部分。我想在遊戲中創建新的CHARACTERS和新的ITEMS。我創建了一個'ObjectFactory'(作爲Parent),它將過濾一個ITEM或CHARACTER想要創建的對象。還有兩個子類'ItemFactory'和'CharacterFactory',它們將是'ObjectFactory'的屬性。然後根據情況使用'ItemFactory'或'CharacterFactory'的'.createObject(...)'。 – lllllll 2012-04-17 11:17:02

+0

你不需要過濾任何東西。 ObjectFactory應該是抽象的,如果用戶想創建一個項目,他們應該只使用ItemFactory。 – Dennis 2012-04-19 09:09:47

回答

0

爲什麼不把孩子指針定義爲Parent * like;

class Parent 
{ 
private : 
    Parent* _os; 
. 
. 
. 
} 

由於子類的基類是父類。

+0

謝謝你的建議,雖然它似乎沒有解決所有的錯誤。 – lllllll 2012-04-17 11:10:41

+0

如果將os更改爲指向Parent的指針,則可以移除opaque指針「class OlderSon;」在parent.hxx中刪除了一些錯誤。 – sardok 2012-04-17 11:29:02

+0

但是,如何使用OlderSon類中的方法?每當我想使用它時,我應該投下它?此外,這些屬性(例如名稱,年齡)將是「父」,而不是「舊」,否? – lllllll 2012-04-17 12:13:04

4

你正在嘗試不可能的事情。您可以通過將Parent:Parent的實現移動到實現文件來修復該錯誤,但是您的代碼仍然是災難性的。

構建一個Parent需要構建一個OlderSon並構建一個OlderSon也需要構建一個Parent(因爲OlderSon 是Parent)。你會有無限的遞歸。

您不能同時擁有父的構造函數調用OlderSon的反之亦然!

+0

你好,謝謝你的回覆。我認爲,因爲Parent類中的OlderSon屬性是私有的,所以它不會被OlderSon繼承。我將它描繪爲:
實例化Parent - >將實例化爲OlderSon作爲Parent的屬性,但私有屬性未被繼承,因此它會停止遞歸。我錯了? – lllllll 2012-04-17 10:55:55

+0

這些只是訪問限制。他們不會使該成員不存在。派生類*是父類的一個實例,並具有其所有功能。 (想一想 - 那麼這行代碼是什麼呢?如果你執行了任何訪問這個變量的基類成員函數,會發生什麼?) – 2012-04-17 10:58:19

+0

我認爲這行只是基於繼承的屬性創建一個新的數據結構從父類。有道理,這只是一個訪問限制的問題,因爲你實際上可以將它轉換爲父類。然後我不知道該怎麼做才能實現這個概念。 – lllllll 2012-04-17 11:02:13

0

Parent()構造函數使用OlderSon()的構造函數。 但它不知道OlderSon,因爲你只是向前聲明它。 (這意味着:我要使用一個名爲OlderSon的類,但是你(Parent.hxx)必須知道的是它的名字,因爲在這個頭文件中我只使用了一個指針。) 嘗試實現一個CXX文件中的父()構造函數,你包括OlderSon.hxx

編輯:

我監督是OlderSon從父繼承...這將導致無限遞歸的事實,這可能是不是你想要的。

+0

我原則上希望能夠直接在.hxx文件上實現它。 @DavidSchwartz指出,我認爲你對無限遞歸是正確的。我在想如何重新設計這個。 – lllllll 2012-04-17 11:09:25