【问题标题】:Should all buttons contain a reference to the controller in MVC code (C++)?所有按钮都应该包含对 MVC 代码 (C++) 中控制器的引用吗?
【发布时间】:2019-05-09 09:18:34
【问题描述】:

我正在尝试找出在 C++ 中为我正在构建的应用程序构建一些代码的最佳(最简洁)方法。我认为 MVC 是一种可行的方法,但经过大量研究后,我并不完全清楚我正在以正确的方式做事。

这里有一个例子来说明我的问题:

型号

我有一个类,其中包含名为Canvas 的绘图数据。用于清除画布当前内容的示例函数是ClearCanvas()

最终,我希望界面中的一个按钮能够调用该函数并清除画布。

控制器

我有一个画布控制器类:CanvasController

控制器创建并保存对画布对象的引用:CurrentCanvas

控制器还创建视图:CanvasView,然后在视图上设置对自身的引用:CurrentCanvasView->SetControllerRef(this);

查看

视图由一系列定义 UI 的嵌套类组成。例如,导致相关按钮的层次结构可能是这样的:

CanvasView
-VerticalBox
--HorizontalBox
---Button

在视图的构造过程中,对控制器的引用从视图传递到所有交互元素,例如。 NewButton->SetControllerRef(this->GetControllerRef());

按下按钮

所以现在当按钮被按下时,它可以像这样工作:

void ClearCanvasButton::OnButtonPressed()
{
    Controller->CurrentCanvas->ClearCanvas();
}

所以我的一般性问题是:(1) 这看起来是正确的做事方式,还是结构不好?

还有(2):控制器是否应该封装画布函数,例如:

void CanvasController::ClearCanvas()
{
    CurrentCanvas->ClearCanvas();
}

这样按钮上的功能可以简单地是:

void ClearCanvasButton::OnButtonPressed()
{
    Controller->ClearCanvas();
}

我只是不确定将控制器的引用传递给最终想要更改模型的视图的所有元素是否正确,或者是否有更简洁的方法。

如果这个问题已经以一千种不同的方式被问了一千次,我深表歉意,我一直在四处寻找以试图理解这一点。

【问题讨论】:

    标签: c++ model-view-controller structure


    【解决方案1】:

    如果您的 Button 类包含类似的成员,则您不需要 ClearCanvasButton

    std::function<void()> onButtonPressed;
    

    similar,而不是

    virtual void onButtonPressed() {};
    

    然后你传递一个引用控制器的 lambda

    CanvasView::CanvasView()
    {
        // make the widgets
        Button.onButtonPressed = [Controller](){ Controller->ClearCanvas(); };
    }
    

    【讨论】:

    • Lambdas 对我来说是新的,所以我仍然在思考你的答案。但它似乎解决了将控制器的引用一直传递到 UI 中的每个单独按钮的问题,这绝对看起来更整洁。啊,我想你的编辑刚刚为我清除了一些东西。 lambda 的捕获部分中的“控制器”是指向视图上控制器的指针,对吗?
    • @kinkersnick 是的。每个 lambda 都是一个唯一的类,其数据成员是捕获,其唯一的成员函数是 operator()
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多