2013-01-13 53 views
-2

我有一個抽象類,名爲UIElement。它的子類爲ButtonCheckboxList在基類中存儲引用

這些子類的構造函數都有一個Renderer&參數:

Button(Renderer& renderer) : _renderer(renderer){}; 
CheckBox(Renderer& renderer) : _renderer(renderer){}; 
List(Renderer& renderer) : _renderer(renderer){}; 

我想不會有路過Renderer&每個子類,因爲渲染對象應該是提供給這些子類繼承UIElement

我不知道如何在不通過構造函數的情況下給UIElementRenderer&。這可能嗎?

編輯:我們只是假設的代碼看起來是這樣的,所以我們可以從側面討論移動:

Button(Renderer& renderer) : UIElement(renderer){}; 
CheckBox(Renderer& renderer) : UIElement(renderer){}; 
List(Renderer& renderer) : UIElement(renderer){}; 
+0

什麼是_renderer,UIElement是否包含Renderer和數據成員? – juanchopanza

+0

@juanchopanza'_renderer'是子類的成員變量,它被定義爲'Renderer&_renderer'。 UIElement當前不包含「渲染器」。 –

+3

基類的構造函數應該初始化引用,但語法不會少。 –

回答

1

我想你想有以下幾點。每個孩子課都通過參考。無論其實際類型如何,每個(具體)UIElement都有一個存儲爲參考的渲染器。要初始化這個,你必須有一個UIElement構造函數來取得(或創建)這樣的渲染器。

class UIElement : ... { 
    UIElement(Renderer &renderer) : _renderer(renderer) 
    {...} 
}; 

然後,在繼承的類中,在構造函數中也需要這樣的引用。將此引用傳遞給基類的構造函數。這是冗長的,但你無法繞過這個。

class Button : class UIElement { 
    Button(Renderer &renderer) : UIElement(renderer) 
    {...} 
}; 

爲了把簡而言之,你不能避免這種冗長的代碼

然而,這是一個很好的事情,雖然:由於你的子類現在有哪些是單獨執行的構造,可以接受特定呈現爲UIElement每個子類:

class Button : class UIElement { 
    Button(ButtonRenderer &renderer = ButtonRenderer()) : UIElement(renderer) 
    {...} 
}; 

正如你所看到的,我將構造函數參數設置爲默認構造的具體渲染器。因此,在創建Button的實例時,可以省略該參數。

+0

他想要做到這一點,而不必通過派生構造函數*渲染器來渲染*。 「我不知道如何給UIElement渲染器,也不需要通過構造函數,這有可能做到嗎?」 – WhozCraig

+0

@WhozCraig好吧,答案是「不」(我寫道:「......但你無法繞過這個」) – leemes

+0

@leemes這不是一個答案,它只是你對你如何設計這個。我故意沒有在'UIElement'中包含'Renderer&'。我將它包含在'UIElement'中的唯一原因是** IFF **,這意味着我不必通過構造函數將它傳遞給所有子類。 –