C++ 两个封装组件之间的通信

C++ 两个封装组件之间的通信,c++,C++,我有三个组件——渲染系统、物理模拟和UI。UI代码是用脚本编写的,不受信任。现在我需要将物理模拟的结果传达给渲染系统,我不确定正确的设计。例如,我可以简单地将新的sim数据复制到渲染器上。然而,这似乎有点浪费。我可以将渲染器设置为直接操作sim卡的数据,但这似乎会违反封装 我打算让这个系统与数千个可能移动的单元一起工作,因此值得记住性能 如何在不违反封装的情况下将数据从一个组件快速移动到另一个组件?我可能会让渲染器分配对象来保存渲染所需的数据。这些对象将定义一个可视界面,该界面足以让渲染器完成其

我有三个组件——渲染系统、物理模拟和UI。UI代码是用脚本编写的,不受信任。现在我需要将物理模拟的结果传达给渲染系统,我不确定正确的设计。例如,我可以简单地将新的sim数据复制到渲染器上。然而,这似乎有点浪费。我可以将渲染器设置为直接操作sim卡的数据,但这似乎会违反封装

我打算让这个系统与数千个可能移动的单元一起工作,因此值得记住性能


如何在不违反封装的情况下将数据从一个组件快速移动到另一个组件?

我可能会让渲染器分配对象来保存渲染所需的数据。这些对象将定义一个可视界面,该界面足以让渲染器完成其工作,但在其他方面是不透明的。尽管对象本身是由渲染器分配/拥有的,但它们对渲染器来说大多是不透明的类型

模拟器拥有这些对象的内部知识,至少在需要比公共界面显示的知识更多的情况下。如果渲染器基本上只是从它们读取数据,那么模拟器可以/将修改它们的状态/向它们写入数据

实现这一点的一种方法是对中间对象使用多重继承。一个父级提供有限的公共接口供渲染器使用,另一个提供更全面的接口供模拟器使用


当然,就像C++本身所提供的保护一样,这基本上只是保护意外,而不是故意颠覆。我假设您对渲染器缺乏信任基本上是为了防止可能出现的bug,而不是试图故意破坏安全性的渲染器。如果您需要针对后者进行保护,那么您需要至少使用操作系统级机制,例如模拟器和渲染器处于不同的进程中,它们之间有某种IPC,但是,当然,这几乎不可避免地会增加相当大的开销。

我可能会让渲染器分配对象来保存渲染所需的数据。这些对象将定义一个可视界面,该界面足以让渲染器完成其工作,但在其他方面是不透明的。尽管对象本身是由渲染器分配/拥有的,但它们对渲染器来说大多是不透明的类型

模拟器拥有这些对象的内部知识,至少在需要比公共界面显示的知识更多的情况下。如果渲染器基本上只是从它们读取数据,那么模拟器可以/将修改它们的状态/向它们写入数据

实现这一点的一种方法是对中间对象使用多重继承。一个父级提供有限的公共接口供渲染器使用,另一个提供更全面的接口供模拟器使用


当然,就像C++本身所提供的保护一样,这基本上只是保护意外,而不是故意颠覆。我假设您对渲染器缺乏信任基本上是为了防止可能出现的bug,而不是试图故意破坏安全性的渲染器。如果您需要防范后者,那么您需要至少使用操作系统级的机制,例如模拟器和渲染器处于不同的进程中,它们之间有某种IPC,但是,当然,这几乎不可避免地会增加相当多的开销。

您能不能将数据表示为常量?sim.cdata或类似的东西?为什么不执行以下操作:在sim数据上定义一个或多或少稳定的接口,并使渲染器仅获取该接口?sim卡的实现细节将以这种方式隐藏,对吗?@Vlad:当然。那只是部分封装,而不是全部封装。。。但我想它会活下来的。考虑把它作为一个答案来回答吧。对于任何严肃的非猜测性回答,都有点含糊不清。你能不能不把数据表示为常量?sim.cdata或类似的东西?为什么不执行以下操作:在sim数据上定义一个或多或少稳定的接口,并使渲染器仅获取该接口?sim卡的实现细节将以这种方式隐藏,对吗?@Vlad:当然。那只是部分封装,而不是全部封装。。。但我想它会活下来的。考虑把它作为一个答案来回答吧。对于任何严肃的非猜测答案都有点含糊。