c++ - OOP设计:一个对象依赖于其所有依赖项的存在

标签 c++ oop

请注意,我几乎没有接受过有关这种设计理论的正规教育,所以如果我对某些概念不了解,请多多包涵。我所有的推理都来自C ++背景。我正在开发用于游戏引擎的基于组件的系统,这是我想出的结构。


有些组件只是数据。
有些节点允许访问该数据。
有些系统仅在节点上运行。
有实体,其中包含这些节点,组件,系统和其他实体。


非常简单,但让我们仅关注组件和节点,对于这些组件和节点,我有一套非常严格的准则。


节点可以提供对实体内组件集合的访问
一个节点取决于其所有基础组件的存在
一个组件可以独立于指向它的任何节点而存在。
系统只能访问节点并对其进行操作


现在,这些节点和组件中的任何一个都可以随时销毁。我通过使用一组侵入列表来维护跨节点迭代的非所有权方法,从而为节点实现了此功能,然后它们在被销毁时自动从列表中删除。但是现在我有一个关于组件的问题。在销毁某个组件时,还必须销毁依赖于该组件的所有节点。通常,对一个在销毁另一个销毁对象时需要销毁的对象的简单解决方法是所有权,您可以在其中将节点简单地放置在组件中,或者在该组件析构函数中动态销毁它,但是这里的节点可以引用多个不同的组件。当一个对象具有多个所有者时,通常,像智能指针这样的引用计数解决方案将所有权归所有这些对象,并在销毁所有所有者时销毁它们,但是这次不是这种情况。我的大问题是,当我拥有一个仅当其所有依赖项都存在时才存在的对象时,我该如何处理所有权,并且一旦任何依赖项被破坏,该对象就会被破坏。

例:

Red are components needed for the existence of the second node

What it looks like after either component it depends on is destroyed

显然,有多种不干净的解决方案,它们具有弱指针,手动删除和对对象是否存在的大量检查,但是像所有问题一样,我想知道是否可以仅通过设计安全地实现。同样,如果这是一个非常简单或众所周知的概念,请给我指出正确的方向。

@Jorgen G Valley-所有对象的确是该实体拥有的,因为所有对象都在包含实体的破坏时被破坏,但是节点,组件,系统和实体应该能够随时动态添加或删除。 。这是一个例子。从世界实体开始,该世界实体包含一个网格和两个向量的实体。这两个向量是独立更新的,但是假设您想将它们作为父对象,只需添加一个节点,将一个向量指定为父向量,然后将任意数量的向量指定为子向量。将节点添加到实体会将其置于非所有者列表中,从而允许先前存在的“父”系统迭代所有“父”节点并在每个父节点上执行功能。取消对象的非公开仅涉及删除节点,但是矢量和网格仍然应该存在。假设您只想破坏该向量并保留网格以供其他模型使用,那么破坏该向量也应该破坏父节点,因为它不再引用有效向量。

这里是一些视觉效果:

这是上述情况的一个例子。 here

现在是删除父节点的示例。 here

请注意,该组件会停留在周围,因为它可以在其他节点中使用,例如在此示例中,渲染节点正在使用它。节点的销毁弥补了父系统使用的入侵列表中的空白,这意味着父系统仅管理拥有父节点的任何其他实体。

现在是删除矢量分量的示例。 here

在这种情况下,还必须删除所有依赖于该矢量的节点,包括父节点和渲染节点。销毁消除了那些入侵列表中的空白,系统继续前进。希望这有助于说明我要实现的设计。

最佳答案

我认为您使事情变得复杂了很多。您说节点和组件可以随时销毁。这是真的吗?

在您的文字中,您将实体描述为所有者,因为您说它包含组件,节点和系统。

我的解决方法是,仅当拥有该组件的实体被销毁时,该组件才会被销毁。这意味着节点,组件和系统无需担心破坏。它是由拥有对象(实体)完成的。

编辑:如果您遇到的情况是组件,节点或系统可以被销毁,而上层实体不被销毁,我很想听听一个例子。本身就是一个非常有趣的问题。 :)

关于c++ - OOP设计:一个对象依赖于其所有依赖项的存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22065774/

相关文章:

php - 在 MVC php 中需要 lang 文件

c++ - 混合 Objective-C 和 C++ 代码

c++ - 在 C++ 项目中使用 igraph

C++ 控制内存访问和指针取消引用

c++ - 如何将 boost::posix_time::ptime 转换为 time_t?

c++ - 为什么不为匿名对象调用析构函数?

C++ 我应该使用转发引用吗?

c++ - 从父亲到 child 的动态类型转换

javascript - 为什么我不能总结数组的所有属性?

java - 如何在Arraylist java中通过ID号搜索并显示对象?