2014-03-27 87 views
3

我目前有這樣的結構,其中Collider是一個抽象類。關於抽象類設計

Collider class structure

我想創建另一個抽象類LevelObj它應該有一個Collider。任何繼承的類LevelObj,例如Wall,則必須進一步定義它需要哪一個碰撞器。然後,我想創建具有LevelObj的容器的對象Level。通過這種方式,我可以從Level訪問ColliderLevelObj的所有功能。

然而,這種方法是不可能的,因爲LevelObj不能容納一個抽象類。即使可能,我也無法在他的任何子女中爲「LevelObj」的遺傳類別「更改」對象Collider

有什麼辦法可以達到同樣的效果嗎?

+7

有一個'的std ::的unique_ptr '成員。 –

+0

看看*裝飾模式*,它可能有助於您的設計。 http://en.wikipedia.org/wiki/Decorator_pattern – DrD

回答

2

您無法創建抽象類的實例。 ...但你可以有一個指針或指針類型爲類型的抽象類,在運行時間得到指向派生類的實例(可以實例化,因爲它們不是抽象的)

所以你的

  • 指針選擇:你必須處理好所有權,即誰必須創建/銷燬該實例的任務。
  • 參考文獻:我不喜歡引用作爲屬性。引用或多或少像一個指針,但它使用不同的語法......並且不能爲空......因此,對引用對象的生命週期的控制必須更緊密。
  • 更高級別(處理引用對象生命週期的方式),unique_ptr,shared_ptr ...

他們都可以指向任何派生類的一個實例......和訪問它作爲一個抽象類

1

但是這種方法是不可能的,因爲LevelObj不能容納一個抽象類。

這當然是對的。但是,它可以包含一個指針或對抽象類的對象的引用。實際的對象,可以嵌入在派生類,如下所示:上述

class LevelObj { 
public: 
    Collider &collider; 
protected: 
    LevelObj(Collider &c) : collider(c) {} 
}; 
class Wall : public LevelObj { 
private: 
    ColliderRect wallCollider; 
public: 
    Wall() : LevelObj(wallCollider) {} 
}; 
class Fence : public LevelObj { 
private: 
    ColliderMesh fenceCollider; 
public: 
    Fence() : LevelObj(fenceCollider) {} 
}; 

假定的LevelObj子類是「嫁」到他們的對撞機。如果不是這樣,則在底部使用unique_ptr<Collider>,並通過向派生類提供指向分配的碰撞器的指針來從派生類的構造函數初始化它。

然後,我想創造出具有LevelObj

容器由於LevelObj是多態的對象Level,你應該使用智能指針的容器LevelObj - 如果級別的對象不共享unique_ptr<LevelObj>級別(或在同一級別內)或shared_ptr<LevelObj>如果級別對象以任何方式共享。