是否所有按钮都应包含对MVC代码(C+;+;)中控制器的引用? 我试图找出一个最好的(最干净的)方法来构造我正在构建的应用程序中的C++代码。我认为MVC作为一种方式是有意义的,但经过大量的研究,我并不完全清楚我是用正确的方式做事的

是否所有按钮都应包含对MVC代码(C+;+;)中控制器的引用? 我试图找出一个最好的(最干净的)方法来构造我正在构建的应用程序中的C++代码。我认为MVC作为一种方式是有意义的,但经过大量的研究,我并不完全清楚我是用正确的方式做事的,c++,model-view-controller,structure,C++,Model View Controller,Structure,下面是一个例子来说明我的问题: 型号 我有一个类,它包含名为Canvas的绘图数据。用于清除画布当前内容的示例函数是ClearCanvas() 最终,我希望界面中的一个按钮能够调用此函数并清除画布 控制器 我有一个canvas的控制器类:CanvasController 控制器创建并保存对画布对象的引用:CurrentCanvas 控制器还创建视图:CanvasView,然后在视图上设置对自身的引用:CurrentCanvasView->SetControllerRef(this) 查看 视图由

下面是一个例子来说明我的问题:

型号

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

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

控制器

我有一个canvas的控制器类:
CanvasController

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

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

查看

视图由一系列定义UI的嵌套类组成。例如,指向相关按钮的层次结构可能如下所示:

CanvasView
-VerticalBox
--HorizontalBox
---Button
void ClearCanvasButton::OnButtonPressed()
{
    Controller->CurrentCanvas->ClearCanvas();
}
在视图的构造函数中,对控制器的引用从视图传递到所有交互元素,例如
NewButton->SetControllerRef(this->GetControllerRef())

按下按钮

因此,现在按下按钮时,其功能如下:

CanvasView
-VerticalBox
--HorizontalBox
---Button
void ClearCanvasButton::OnButtonPressed()
{
    Controller->CurrentCanvas->ClearCanvas();
}
所以我的一般问题是:(1)这似乎是做事情的正确方式,还是结构不良

另外(2):控制器是否应封装画布功能,例如:

void CanvasController::ClearCanvas()
{
    CurrentCanvas->ClearCanvas();
}
这样,按钮上的功能可以简单地为:

void ClearCanvasButton::OnButtonPressed()
{
    Controller->ClearCanvas();
}
我只是不确定将对控制器的引用传递给最终想要更改模型的视图的所有元素是否正确,或者是否有更干净的方法

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

如果你的
按钮
类包含这样的成员,你不需要类
ClearCanvasButton

std::function<void()> onButtonPressed;
然后传递引用控制器的lambda

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

兰姆达斯对我来说是新事物,所以我仍然对你的答案感到困惑。但它似乎解决了将控制器的引用一直传递到UI中每个单独按钮的问题,这显然看起来更整洁。啊,我想你的编辑为我澄清了一些事情。lambda的捕获部分中的“控制器”是指向视图上控制器的指针,对吗?@kinkersnick是。每个lambda都是一个唯一的类,其数据成员是捕获,其唯一的成员函数是
operator()