Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象之间的通信(在C+;+;) 我是强>当前编码我最大的C++程序,使用多个对象< /St>来管理一个Windows(使用Windows API函数)、一个3D引擎(DirectX)和其他对象一起工作来完成他们的任务。_C++_Object_Communication_Interaction - Fatal编程技术网

对象之间的通信(在C+;+;) 我是强>当前编码我最大的C++程序,使用多个对象< /St>来管理一个Windows(使用Windows API函数)、一个3D引擎(DirectX)和其他对象一起工作来完成他们的任务。

对象之间的通信(在C+;+;) 我是强>当前编码我最大的C++程序,使用多个对象< /St>来管理一个Windows(使用Windows API函数)、一个3D引擎(DirectX)和其他对象一起工作来完成他们的任务。,c++,object,communication,interaction,C++,Object,Communication,Interaction,我在组织对象时遇到了一些问题,因此它们可以智能地相互交互。 当一个对象必须执行操作,或者更糟的是,将参数传递给另一个对象时,我努力定义协调和组织代码的最佳解决方案。 这里有一个很好的例子: 正如我所说,在我的程序中有两个对象:(1)“windowManager”处理与窗口本身相关的所有操作;(2)“RenderManager”处理从初始化到渲染每个帧的所有DirectX操作 调整窗口大小时,必须重置DirectX以调整绘图区域,否则图像会拉伸,因此“windowManager”必须能够命令“Re

我在组织对象时遇到了一些问题,因此它们可以智能地相互交互。 当一个对象必须执行操作,或者更糟的是,将参数传递给另一个对象时,我努力定义协调和组织代码的最佳解决方案。

这里有一个很好的例子:

正如我所说,在我的程序中有两个对象:(1)“windowManager”处理与窗口本身相关的所有操作;(2)“RenderManager”处理从初始化到渲染每个帧的所有DirectX操作

调整窗口大小时,必须重置DirectX以调整绘图区域,否则图像会拉伸,因此“windowManager”必须能够命令“RenderManager”重置

我想不出比创建一个“rendermanager.Reset()”方法更好的解决方案,然后为窗口管理器创建两个方法“windowManager.getrequestrenderreset()”和“windowManager.setrequestrenderreset(bool Reset)”

当我的窗口调整大小时,对象“windowManager”调用它自己的方法“windowManager.SetRequestRenderReset(true)”,以更改可以从“get方法”查询的参数之一。 因此,在我的主循环中(在主循环的无限循环中),我应用了一些验证,例如:

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,为了能够理解你的解决方案并将其部署到我的项目中,我肯定需要阅读更多关于事件处理的内容,但我想我会理解这个概念。睡个好觉后:)