C ++:字段对象可以在不存储指针的情况下知道它的“父”吗?

时间:2013-03-16 19:36:51

标签: c++ pointers structure

假设我有这个设置:

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

类型XView仅用于此一个字段;它也是内部的,因此禁止从外部实例化,即禁止将其用于其他任何内容。

因此,假设 XView类型的任何对象是X::view字段,是否可以从{{1}的地址中找到X的地址,完全保持在C ++标准定义的行为中,没有类型 - 双关语?即有可能做这样的事情:

XView

我当然可以存储一个指针,所以这会像void XView::some_function () { X& this_x = some_computations_involving (this); } 那样变得微不足道,但是如果可能的话,我希望没有指针。

编辑:请注意,我需要一个没有涉及类型惩罚的答案,否则我宁愿使用#34;只需存储指针"溶液

2 个答案:

答案 0 :(得分:1)

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

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

第二种方法是在XView不是X的第一个成员时使用偏移量。

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

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

答案 1 :(得分:0)

最重要的是你是否真的需要从子对象访问父对象而不是反之亦然。

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

您的代码是否可以重构为更面向对象? (并且可能使用继承(并通过使用super :: some_function ...调用父代)