2014-11-08 136 views
0

來自Java我對調用基類構造函數(或super())有點困惑。 我有2個班級:玩家(抽象類)和HumanPlayer這是玩家的孩子。 現在,我對球員一個構造函數聲明:C++調用子類中的基類構造函數

Player(string name, list<Point> points); 

,現在即時通訊試圖實現這種東西:

HumanPlayer() { 
    string name = get name from user... 
    list<Point> points = get points from user... 
    ... 
    ... 
    ... 
    super(name, points); 
} 

真正的新C++,有一個很難與它的語法。 關於,

+0

請檢查[這個問題](http://stackoverflow.com/questions/120876/c-superclass-constructor-calling-rules)。它應該給你正確的語法。 – Nemesis 2014-11-08 15:25:06

+0

我做到了。但它強制我在實現子構造函數之前調用超級構造函數。不幫助我 – 2014-11-08 15:26:00

+0

不完全確定,但你可以使用'Player(name,points);'而不是'super()'嗎? – Nemesis 2014-11-08 15:28:02

回答

2

初始化派生類的基礎的唯一方法是在構造函數的初始化列表中。這是冒號之後,在函數體之前的事情。沒有其他正常方式做到這一點。

HumanPlayer() : 
     Player("...", list_of_points) 
{ 
... 
} 

如果你真的有「中」的構造函數體初始化基,不在名單上,你必須修改你的代碼 - 通過引入在基本的「初始化()」函數,例如班或使用「pimpl成語」。

+0

「你必須修改你的代碼 - 例如在基類中引入」initialize()「函數或使用」pimpl idiom「。」 ...或修復你的設計。 – edmz 2014-11-08 15:48:05

0

如果「從用戶那裏得到的名字......」和「從用戶那裏得到點......」位都非常簡單,並且可以實現爲簡單的表達式或函數調用:

HumanPlayer() 
    : Player("get name from user... code", 
      "get points from user... code") 
{ 


} 

如果,另一方面,兩個「get」位是非平凡的,並且彼此具有相互依賴關係,則這會變得更復雜一些。像這樣的典型方法的東西的簡要說明:

class HelperClass { 

public: 

    std::string name; 
    std::list<Point> points; 

    HelperClass() 
    { 
     // The constructor here will do whatever is needed to initialize name and points 
    } 
}; 


// ... 

HumanPlayer(const HelperClass &helper=HelperClass()) 
: Player(helper.name, helper.points) 
{ 
} 

有些人可能會覺得這是有些黑客十歲上下的:濫用默認參數值來實例化在構造函數中使用的對象。但它的工作。如果使用至少支持C++ 11標準的C++編譯器,則可以以不同的方式稍微好一些。

相關問題