C++:字段对象可以在不存储指针的情况下知道其"parent"吗?

C++: can a field object know its "parent" without storing a pointer?

本文关键字:情况下 parent 指针 对象 字段 存储 C++      更新时间:2023-10-16

假设我有如下设置:

struct XView;
struct X
{
  ...
  XView  view;
};

类型XView仅用于此字段;它也是内部的,所以从外部实例化它是被禁止的,也就是说,将它用于其他任何地方。

因此,假设任何XView类型的对象都是X::view字段,是否有可能从XView的地址中找到X的地址,从而完全保持c++标准定义的行为并且没有类型双关语?也就是说,是否可以这样做:
void XView::some_function ()
{
  X&  this_x = some_computations_involving (this);
}

我当然可以存储一个指针,所以这将变得像x = *this->parent_x一样琐碎,但如果可能的话,我希望没有一个。

编辑:请注意,我需要一个没有涉及类型双关语的答案,否则我宁愿使用"只存储指针"的解决方案

第一种方法是让XView成为X的第一个成员,然后你可以这样做:

void XView::some_function ()
{
   X & this_x = reinterpret_cast<X&>(*this);
}

第二种方法是当XView不是X的第一个成员时使用offset。

从技术上讲,如果不涉及虚拟性,这两种方法都是相同的,只是第一种方法是第二种方法的特殊情况(即当offset = 0时)。

至于编辑,我认为,没有转换是不可能的。您必须将指针存储在XView中,或者维护指针的映射(或其他一些数据结构)。

最重要的是您是否真的需要从子对象访问父对象,而不是相反。

我建议你使用某种双向链表或类似的东西。

你的代码可以重构得更面向对象吗?(并且可能使用继承(并通过使用super::some_function…调用父类)