Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++_Design Patterns - Fatal编程技术网

C++ 寻找孩子

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在其中搜索,但这意

我有A类。A类负责管理B对象的生存期,它包含B对象的容器,即
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*等等。我无法改变这一点。如果没有指向某个对象的指针,那么“找到”该对象究竟意味着什么?好的,没错。我写错了。我有指向其他对象的指针,而不是对象本身。