寻找指针的起源

3
如果你有一个object1和一个指向object2的指针,并且我们当前在Object 2中,那么我们能从object2到达object1吗?如何实现?
 (OBJECT1) --------> (OBJECT2)
                      we are here and we don't know where/what OBJECT1 is

10
请告诉我你的电话号码,然后你就可以打电话给我了。 ;v) - Fred Larson
如果你曾经拥有 OBJECT1,现在你有了 OBJECT2,最好还是记住你之前的指针。如果你实际上有一个单向链表,你可以始终构建一个临时列表或指针堆栈来帮助导航。 - quamrana
这让人想起了对于“comefrom语句”的不断请求(例如,请参见http://c2.com/cgi/wiki?ComeFrom)。 - David Hammen
8个回答

14

不行。假设您有多个指针指向 OBJECT2

(POINTER1) ------------\
(POINTER2) -------------\
(POINTER3) --------------> (OBJECT2)
.....      -------------/
(POINTERN) ------------/

当你“上升”时,应该走哪个指针?


2
按照楼主的逻辑,为什么不整个列表都指向呢?答案是否定的,并不是因为你无法回指,而是因为没有可指的内容。对象之间的关系在程序逻辑中,而不在编程语言中。 - littleadv

4

没有简单的方法来实现这一点。您可以遍历整个地址空间,但是在C语言中没有“反向查找”。


1
即使您在地址空间中找到了OBJECT2的地址,也无法知道它是指针而不是其他一些仅具有与指针地址相同表示的数据。 - Anders Abel

3
不,你需要在对象2中存储父对象指针。例如,Qt库经常这样做。

2

无法完成。您必须在object2中创建对object1的引用(双向链接与单向链接列表是此现象的一个示例)。


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"
}

但是在这里,只有Class1可以使用这个系统。

所以实际问题是:Object 2需要与Object 1做什么?为什么它要指向它?


0
一般来说:你是无法做到的。只有当你的对象存储了指向其父/兄弟的指针(例如:双向链表,带有父链接的树)或者存在一个“资源管理器”对这些关系有一定的了解时,才可以实现此功能。

0

唯一的方法是,如果对象2有一个指向对象1的指针。

另一方面,如果你正在编写垃圾收集器,你可以获取对象2的地址,并查找内存中该地址,现在你就知道了对象1指向对象2的指针在哪里。这是保守垃圾收集器背后的基本思想。要弄清楚对象1在哪里需要更多的工作和对对象在内存中布局的了解。


0

不,没有办法做到那样。在C和C++中,指针是单向的,并且没有可以搜索指针的中央注册表列表(就像在关系数据库中所做的那样)。

为了能够“返回”,您必须实现逻辑,从OBJECT2到OBJECT1维护一个向后指针,并在其他OBJECT1指向OBJECT2时更新它。当然,这仅在任何时候只有一个OBJECT1可以指向OBJECT2时才起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接