子对象调用父对象的良好实践方式

时间:2018-11-30 08:37:39

标签: c++

在面向对象设计中,我有一个box类和一个dot类。每个框包含一个点列表,这些点具有移动的能力。当这些点移到框的边界之外时,它们将从该框列表中删除,而是放入相邻的点框列表中。这样,我们始终可以跟踪每个框中的每个点。问题是关于如何从点开始进行良好的回调。我如何从dot类中得知要保留的框以将其从列表中删除? 我可能的解决方案是在点类中包含一个父引用,并指向包含该点的任何框的指针,但这似乎是一种代码味道,我很好奇如何避免这种情况以及良好的解决方案是什么

如果您认为一开始在框内的列表中包含点是不好的设计,请随时评论原因以及建议的解决方案。 请记住,我觉得调用层次结构中的这种尴尬的回调是一个经常发生的问题,即使在这种情况下,将点存储在框中也是一个坏主意,但我仍然很好奇孩子的良好做法是什么叫父母。

1 个答案:

答案 0 :(得分:1)

  

每个框都包含点[...]

的列表

我将假设您的盒子和点之间没有继承关系(术语“孩子”和“父母”通常是指继承关系)。

  

我可能的解决方案是在点类中包含一个父引用,并指向包含该点的任何框的指针,但这似乎是一种代码气味[...]

如果您需要点来 notify 通知其包含的框,那么您绝对需要在点类中的某个位置引用(指针或其他方式)。它可以隐藏在向量中或带有继承,但仍然必须存在。我能想到的另一种方法是让这些框定期检查它们包含的所有点并以此方式更新其列表。但这可能不是您想要的。

  

如果您认为将点放在列表框中的列表中放在首位[...]

根据盒子的确切位置(我正在考虑它们的放置方式),很可能有一个更好的解决方案,它不涉及盒子和点之间的任何依赖关系。但是没有更多细节,我不能说太多。


有两种主要方法可以编写此通知机制。一种是通过使每个点存储指向其包含框的直接指针,并在点类知道的框类中使用特殊的“通知”方法。当一个点需要通知其包含框时,它仅在其当前具有的指针上调用该方法。另一个是通过为每个点提供一个回调函数(可以是lambda或其他函数),该函数隐式包含对包含框的引用。通知其包含框的所有点都需要调用此回调函数。据推测,这将为回调实际执行的操作提供更大的灵活性,并在该回调中隐藏对该框的引用。但是,如果您不习惯于构建此回调,则看起来可能会更加复杂。