如何在不复制数据的情况下组成一个装饰类层次结构

3

我有三个层次相关的类:

  • Pattern,其中有类型为std :: vector<Panel>的受保护字段_panels
  • Panel,反过来,有一个受保护字段_edges,它是类型为std :: vector<Edge>的。
  • Edge 最后有一个受保护字段_verts,它是类型为std :: vector<Eigen :: Vector2f>的。

我还有一个纯虚类Renderable,它有一个纯虚函数virtual void render()。 我想创建每个三个类的专门版本,这些版本都继承自 Renderable ,例如:

class VPattern : public Pattern, public Renderable
{
public:
    void render() { ... }
protected:
    ...
private:
    ...
}; // class VPattern

然而,_panels字段仍将包含Panel的实例,而不是VPanel。这意味着我必须将EdgePanel的绘制逻辑放在Pattern的绘制函数中,这显然并不理想。
这里是否有其他不需要这么麻烦的方法?使用包装类是否更合适?
1个回答

0

你有没有想过为什么不能创建一个 Drawable 虚类,其中包含一个纯虚函数 draw(),所有的 drawable 子类都必须实现它呢?

public virtual struct Drawable {
    virtual void draw() = 0;
};

public struct Edge : Drawable {
    void draw() {}
};

//...

嗨Bizkit,抱歉我可能没有表达清楚。这正是我所拥有的。但是,如果我有一个从Renderable继承的VPattern,当我调用VPattern :: render时,我希望_panels中的所有面板都被绘制出来。这很棘手,因为VPattern中_panels中的实例是Panel类型,而不是VPanel类型。我想知道如何将面板的绘制委托给_panels中的实例,而无需首先将所有“Panels”复制到“VPanels”,如果这有意义的话。 - Moos Hueting
你需要指定你想要的 render 版本。所以当你实现 VPattern::render() 时,你需要让它通过向量调用 Panel::render。 - Bizkit
Panel :: render 不存在 - VPanel :: render 存在。但 _panels 是 Panel 的向量,而不是 VPanel - 这就是问题所在。 - Moos Hueting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接