C++ 寻找孩子
我有A类。A类负责管理B对象的生存期,它包含B对象的容器,即C++ 寻找孩子,c++,design-patterns,C++,Design Patterns,我有A类。A类负责管理B对象的生存期,它包含B对象的容器,即map,每个B对象包含C对象的容器,即map。我有一个全局A对象,用于整个应用程序 我有以下问题: 我有一个CGuid对象,我想用它来找到我的C对象。但要做到这一点,我还需要知道BGuid对象,它将告诉我应该在哪个B对象中查看我的C对象。但我只有CGuid,这意味着我必须检查每个B对象,看看它是否包含我的C对象。但我认为这是混乱的。 我想也许我应该有另一个类,比如说M,它将包含我所有C对象的映射,我可以直接用CGuid在其中搜索,但这意
map
,每个B对象包含C对象的容器,即map
。我有一个全局A对象,用于整个应用程序
我有以下问题:
我有一个CGuid对象,我想用它来找到我的C对象。但要做到这一点,我还需要知道BGuid对象,它将告诉我应该在哪个B对象中查看我的C对象。但我只有CGuid,这意味着我必须检查每个B对象,看看它是否包含我的C对象。但我认为这是混乱的。
我想也许我应该有另一个类,比如说M,它将包含我所有C对象的映射,我可以直接用CGuid在其中搜索,但这意味着我需要维护额外的映射来进行搜索
此外,我希望在将来的C类中包含map
,所以对于D对象我也会遇到同样的问题,这次更糟糕的是,我需要Bguid、Cguid和Dguid来查找我的D对象
如何解决这个问题?您对内存有任何限制吗?如果没有,我会维护反向查找表(映射),所以你需要一个用于C->B,当你添加D时,你需要第二个D->C,所以如果你有C,要正确定位它,你需要一个查找来定位B,然后从a开始你可以向下遍历,再进行两次查找。比在所有的Bs中迭代寻找C要快得多 另一种选择是,您是否可以控制Guid,如果可以,您可以尝试将“路径”信息添加到Guid中。例如,假设B guid为“B.1”、“B.2”、“B.3”等。分隔符“.”后的后缀告诉您它是哪个B。当您添加C时,您可以简单地添加一个额外的“.”,即C1的guid是(假设它存储在B1中)=“B.1.1”,因此现在要查找对象,您需要解析键,然后您就有了到C1的“路径”。
映射
,映射
,映射
使用GUID可以获得对象和对象的父对象。使用对象可以获得GUID。从头开始递归。您可以将子GUID的范围分配给每个父GUID。假设
BGuid
在区间[0,9]
中,而CGuid
在区间[0,99]
中。您现在可以使用如下函数将十个cguid
映射到每个BGuid
:
mapGuids(B): CGuid => BGuid = B % 10
现在,您将始终知道通过树的路径。当有许多节点时,您需要保持树的平衡以获得更好的性能。您有一个典型的父子关系。 我建议您通过不指定如何处理(即使用地图)来改进设计。 使用容器来存储子对象,并让子对象具有指向父对象的指针。 用这种方法很容易从任何一点移动到顶部
对于这些情况,一个有用的OOP设计模式是,我只想说我的GUI是指向对象的实际指针,即BGuid是B*等等。我无法改变这一点。如果没有指向某个对象的指针,那么“找到”该对象究竟意味着什么?好的,没错。我写错了。我有指向其他对象的指针,而不是对象本身。