在基类中存储引用

时间:2013-01-13 12:34:37

标签: c++ c++11

我有一个名为UIElement的抽象类。它有子类ButtonCheckboxList

这些子类的构造函数都有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){};

1 个答案:

答案 0 :(得分: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的实例时,您可以省略参数。

相关问题