如果你有一个object1和一个指向object2的指针,我们当前在Object 2中,那么我们可以从object2到object1吗?怎么样?
(OBJECT1) --------> (OBJECT2)
we are here and we don't know where/what OBJECT1 is
答案 0 :(得分:14)
没有。假设你有几个指向OBJECT2的指针
(POINTER1) ------------\ (POINTER2) -------------\ (POINTER3) --------------> (OBJECT2) ..... -------------/ (POINTERN) ------------/
当你“上升”时,你应该去哪个指针?
答案 1 :(得分:4)
没有简单的方法可以做到这一点。您可以遍历整个地址空间,但C
中没有“反向查找”答案 2 :(得分:3)
不,您需要将父对象指针存储在对象2中。例如,Qt库会执行此操作。
答案 3 :(得分:2)
不能这样做。你必须在object2中创建对object1的引用(双向链接与单链接列表就是这种现象的一个例子)。
答案 4 :(得分:1)
不,无法追溯标准C / C ++指针。
实际上,您可以重载->
运算符以在某处设置反向指针,但最好问问自己Object 2
是否确实需要指回Object 1
。
如果是这样,将指针从2存储到1可能是最好的方法。
为了做到这一点,并且为了能够跟踪多个引用,可以引导您在Object2
的类中编写引用方法:
Class2 * Class2::getPointer(void * fromObject1)
{
... add "from" to a table of Class2 that stores all the "Object 1"
}
这样做的一个限制是没有任何东西阻止任意Object 1
存储指向Class2
实例的指针(“object 2
”)而不声明自己。
另一个限制是Class2
知道“object 1
”为void *
。除非您定义能够指向Class2
并且用void *
替换void *
的类的层次结构,否则拥有Class2 * Class2::getPointer(Class1 * fromObject1)
{
... add "from" to a table of Class2 that stores all the "Object 1"
}
的集合并不是很有价值:
Object 2
但是在这里,只有Class1可以使用这个系统。
所以实际问题是:Object 1
需要{{1}}做什么?它为什么要指回它?
答案 5 :(得分:0)
一般情况下:你不能。如果对象存储指向其父/兄弟的指针(例如:双链表,带有父链接的树),或者存在对这些关系有一定了解的“资源管理器”,则只能这样做。
答案 6 :(得分:0)
唯一的方法是,如果对象2有一个指向对象1的指针。
另一方面,如果您说,编写垃圾收集器,您可以获取对象2的地址,并通过内存查找该地址,您现在可以知道object1指向object2的指针。这是保守的垃圾收集器背后的基本思想。需要更多的工作和知识,了解如何在内存中布置对象以确定对象1的位置。
答案 7 :(得分:0)
不,没有办法做到这一点。 C和C ++中的指针是单向的,并且没有可以搜索的指针的中央注册表列表(就像在关系数据库中完成的那样)。
为了能够“返回”,您必须实现维护从OBJECT2到OBJECT1的向后指针的逻辑,并在OBJECT2被另一个OBJECT1指向时更新它。这当然只有在任何时候只有一个OBJECT1可以指向OBJECT2时才有效。