2013-01-13 2 views
-2

나는 추상 클래스 인 UIElement을 가지고 있습니다. 그것은 하위 클래스가 있습니다 Button, Checkbox, List. 이 자식 클래스에 대한기본 클래스에 참조를 저장합니다.

생성자 모두가 Renderer& 매개 변수가 있습니다 :

Button(Renderer& renderer) : _renderer(renderer){}; 
CheckBox(Renderer& renderer) : _renderer(renderer){}; 
List(Renderer& renderer) : _renderer(renderer){}; 
내가 렌더러 객체가 사용할 수 있어야하기 때문에 이러한 자식 클래스로, 각 자식 클래스에 Renderer&을 통과하지 싶습니다

UIElement을 상속합니다.

나는 UIElement을 생성자를 거치지 않고 Renderer&에게 줄 방법을 모르겠다. 가능한가요?

편집 : 그냥 코드는 다음과 같습니다 가정하자, 그래서 우리는 측면 토론에서 이동할 수 있습니다 :

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

난 당신이 다음을 할 생각합니다. 각 하위 클래스는 referece를 전달합니다. 모든 (콘크리트) 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) 
    {...} 
}; 

당신이 볼 수 있듯이, I 생성자 매개 변수를 기본으로 구성된 콘크리트 렌더러로 설정합니다. 따라서 Button의 인스턴스를 만들 때 매개 변수를 생략 할 수 있습니다.

+0

그는 파생 생성자 *를 통해 렌더러를 전달하지 않고도이 작업을 수행하려고합니다. "나는 UIElement에 렌더러를 제공하는 방법을 모르지만 생성자를 거치지 않고이 작업을 수행 할 수 있습니까?" – WhozCraig

+0

@WhozCraig 대답은 "아니오"입니다. (나는 썼습니다 : "...하지만이 문제를 해결할 수는 없어요") – leemes

+0

@leemes 이것은 대답이 아닙니다. 어떻게 설계 할 것인가? 이. 의도적으로'UIElement'에'Renderer &'를 포함하지 않았습니다. 'UIElement'에 포함시키려는 유일한 이유는 ** IFF **입니다. 이는 생성자를 통해 모든 하위 클래스에 전달하지 않아도된다는 것을 의미합니다. –

관련 문제