寻找指针的起源

时间:2011-07-19 20:36:46

标签: c++ c pointers

如果你有一个object1和一个指向object2的指针,我们当前在Object 2中,那么我们可以从object2到object1吗?怎么样?

 (OBJECT1) --------> (OBJECT2)
                      we are here and we don't know where/what OBJECT1 is

8 个答案:

答案 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时才有效。