gpt4 book ai didi

c++ - 所有按钮都应包含对 MVC 代码 (C++) 中 Controller 的引用吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:04 26 4
gpt4 key购买 nike

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

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

型号

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

最终,我希望界面中有一个按钮能够调用此函数并清除 Canvas 。

Controller

我有一个 Canvas Controller 类:CanvasController

Controller 创建并保存对 Canvas 对象的引用:CurrentCanvas

Controller 还创建 View :CanvasView,然后在 View 上设置对自身的引用:CurrentCanvasView->SetControllerRef(this);

查看

View 由一系列定义 UI 的嵌套类组成。例如,导致有问题的按钮的层次结构可能是这样的:

CanvasView
-VerticalBox
--HorizontalBox
---Button

在 View 的构造函数中,对 Controller 的引用从 View 传递到所有交互元素,例如。 NewButton->SetControllerRef(this->GetControllerRef());

按下按钮

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

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

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

还有(2): Controller 是否应该封装 Canvas 功能,例如:

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

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

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

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

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

最佳答案

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

std::function<void()> onButtonPressed;

similar , 而不是

virtual void onButtonPressed() {};

然后您传递一个引用 Controller 的 lambda

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

关于c++ - 所有按钮都应包含对 MVC 代码 (C++) 中 Controller 的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56056145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com