(OBJECT1) --------> (OBJECT2)
we are here and we don't know where/what OBJECT1 is
不行。假设您有多个指针指向 OBJECT2
(POINTER1) ------------\ (POINTER2) -------------\ (POINTER3) --------------> (OBJECT2) ..... -------------/ (POINTERN) ------------/
当你“上升”时,应该走哪个指针?
没有简单的方法来实现这一点。您可以遍历整个地址空间,但是在C语言中没有“反向查找”。
无法完成。您必须在object2中创建对object1的引用(双向链接与单向链接列表是此现象的一个示例)。
不,标准的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做什么?为什么它要指向它?
唯一的方法是,如果对象2有一个指向对象1的指针。
另一方面,如果你正在编写垃圾收集器,你可以获取对象2的地址,并查找内存中该地址,现在你就知道了对象1指向对象2的指针在哪里。这是保守垃圾收集器背后的基本思想。要弄清楚对象1在哪里需要更多的工作和对对象在内存中布局的了解。
不,没有办法做到那样。在C和C++中,指针是单向的,并且没有可以搜索指针的中央注册表列表(就像在关系数据库中所做的那样)。
为了能够“返回”,您必须实现逻辑,从OBJECT2到OBJECT1维护一个向后指针,并在其他OBJECT1指向OBJECT2时更新它。当然,这仅在任何时候只有一个OBJECT1可以指向OBJECT2时才起作用。
OBJECT1
,现在你有了OBJECT2
,最好还是记住你之前的指针。如果你实际上有一个单向链表,你可以始终构建一个临时列表或指针堆栈来帮助导航。 - quamrana