对象之间的通信(在C+;+;) 我是强>当前编码我最大的C++程序,使用多个对象< /St>来管理一个Windows(使用Windows API函数)、一个3D引擎(DirectX)和其他对象一起工作来完成他们的任务。
我在组织对象时遇到了一些问题,因此它们可以智能地相互交互。 当一个对象必须执行操作,或者更糟的是,将参数传递给另一个对象时,我努力定义协调和组织代码的最佳解决方案。 这里有一个很好的例子: 正如我所说,在我的程序中有两个对象:(1)“windowManager”处理与窗口本身相关的所有操作;(2)“RenderManager”处理从初始化到渲染每个帧的所有DirectX操作 调整窗口大小时,必须重置DirectX以调整绘图区域,否则图像会拉伸,因此“windowManager”必须能够命令“RenderManager”重置 我想不出比创建一个“rendermanager.Reset()”方法更好的解决方案,然后为窗口管理器创建两个方法“windowManager.getrequestrenderreset()”和“windowManager.setrequestrenderreset(bool Reset)” 当我的窗口调整大小时,对象“windowManager”调用它自己的方法“windowManager.SetRequestRenderReset(true)”,以更改可以从“get方法”查询的参数之一。 因此,在我的主循环中(在主循环的无限循环中),我应用了一些验证,例如:对象之间的通信(在C+;+;) 我是强>当前编码我最大的C++程序,使用多个对象< /St>来管理一个Windows(使用Windows API函数)、一个3D引擎(DirectX)和其他对象一起工作来完成他们的任务。,c++,object,communication,interaction,C++,Object,Communication,Interaction,我在组织对象时遇到了一些问题,因此它们可以智能地相互交互。 当一个对象必须执行操作,或者更糟的是,将参数传递给另一个对象时,我努力定义协调和组织代码的最佳解决方案。 这里有一个很好的例子: 正如我所说,在我的程序中有两个对象:(1)“windowManager”处理与窗口本身相关的所有操作;(2)“RenderManager”处理从初始化到渲染每个帧的所有DirectX操作 调整窗口大小时,必须重置DirectX以调整绘图区域,否则图像会拉伸,因此“windowManager”必须能够命令“Re
if (windowManager.GetRequestRendererReset()) { // The window has been resized, we need to reset DirectX
rendererManager.Reset(windowManager.GetWindow());
windowManager.SetRequestRendererReset(false);
}
这感觉非常次优,我觉得有更好的解决方案。
除此之外,我现在需要向我的对象“RenderManager”发送更复杂的信息,比如在特定位置写入图像的文本,如果没有智能组织,我的整个代码可能会变得一团糟
对于如何优化对象之间的交互和通信,是否有一些指导原则?
关于这一点,您有好的经验/教程吗?或者您有好的实践范例吗?对于您描述的特定场景,使用事件机制是一种非常可靠的方法。窗口管理器可以公开一个函数,该函数接受另一个函数并在调整其大小时调用它。消费RenderManager可以通过传递lambda/function指针/std::function/etcThank you Aluan轻松地与此交互,我从未编写过事件机制。你会有课程或教程来学习这个吗?我明天要研究这个问题。对不起,我不知道C++中有什么好的事件处理教程。下面是我如何做的:在窗口管理器中有一个字段:
std::vector resize\u handlers代码>和一个函数void on_resize(std::function eventHandler){resizeHandlers.push_back(handler)}
当窗口被调整大小时,它会像调用for(auto f:resize_handlers){f(Bounds)}
一样调用它们,然后使用rendermanager
注册一个类似windowManager.on_resize([&](auto rect){rendermanager.something();});
哇,非常感谢Aluan,我确实需要阅读更多关于事件处理的内容,以便能够理解您的解决方案并将其部署到我的项目中,但我想我会理解这个概念。在睡了一个好觉之后:)对于您描述的特定场景,使用事件机制是一种非常可靠的方法。窗口管理器可以公开一个函数,该函数接受另一个函数并在调整其大小时调用它。消费RenderManager可以通过传递lambda/function指针/std::function/etcThank you Aluan轻松地与此交互,我从未编写过事件机制。你会有课程或教程来学习这个吗?我明天要研究这个问题。对不起,我不知道C++中有什么好的事件处理教程。下面是我如何做的:在窗口管理器中有一个字段:std::vector resize\u handlers代码>和一个函数void on_resize(std::function eventHandler){resizeHandlers.push_back(handler)}
当窗口被调整大小时,它会像调用for(auto f:resize_handlers){f(Bounds)}
一样调用它们,然后使用rendermanager
注册一个类似windowManager.on_resize([&](auto rect){rendermanager.something();});
哇,非常感谢你,Aluan,为了能够理解你的解决方案并将其部署到我的项目中,我肯定需要阅读更多关于事件处理的内容,但我想我会理解这个概念。睡个好觉后:)