我正在设计一个用于显示基于DataModel的ModelView对象的软件。

DataModel由一个ModelView对象显示,该对象本身可以包含一堆ViewObject。就像ViewObjects的容器一样,它构成一个ModelView并最终显示DataModel。

这些ViewObject在ModelView内部可以相互依赖,例如,一个ViewObject的位置可能取决于另一ViewObject。

然后,还根据所有ModelView确定最终屏幕的布局。

这些ViewObject是从通用BaseView类继承的,但是客户端可以通过从BaseView类继承来简单地将新的ViewObject类型添加到层次结构中。这些派生类可能具有特定的功能,可能需要调用这些功能才能将它们在ModelView中连接在一起。

有人可以给我一个想法,如何在不进行动态投放的情况下做到这一点吗?

编辑:我定义了以下类:

class EventView // ModelView class containing
{
private:
    //Pointer to BaseViews constituting to ModelView
    std::shared_ptr<BaseView> m_FlowView;
    std::shared_ptr<BaseView> m_SourceView;
    std::shared_ptr<BaseView> m_TargetView;
    std::shared_ptr<BaseView> m_WorkerView;
    std::shared_ptr<TEvent> m_Model;
}

客户端可以从BaseView继承,BaseView可以是直线,圆或曲线或其他任何东西。因此,它们可以完全不同。以我的观点,我只需要一个BaseView对象列表即可绘制它们,但这是客户端代码负责将它们互连在一起并将它们放置在一起的责任。但是由于我将仅存储BaseView指针,因此客户端可能需要向下转换以互连元素。

最佳答案

根据我对问题的了解,您正在存储对象的基本指针,但是从外部开始,您希望将它们作为它们的派生对象进行操作。

在这种情况下,向下转换至关重要。

尽管您的问题含糊不清,但我发现您的情况与对话框中的控件非常相似,对话框和对话框都是窗口,但是您说CheckBox是您要对其进行特殊操作且具有扩展功能的专用窗口。

主要框架使用强制转换来解决此问题,例如MFC here

较新的Qt框架也使用findChildren函数中的强制转换。

我希望您可以根据此信息评估您的解决方案,并可能与它保持和平。

08-06 15:02