1

假设我有这个设置:

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

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

那么,假设任何类型的对象XView都是一个字段,是否有可能从 的地址中X::view找到地址,完全保持在 C++ 标准定义的行为范围内并且没有类型双关语?即是否有可能做这样的事情:XXView

void XView::some_function ()
{
  X&  this_x = some_computations_involving (this);
}

我当然可以存储一个指针,所以这将变得像 一样微不足道x = *this->parent_x,但如果可能的话,我想没有一个。

编辑:请注意,我需要一个不涉及类型双关的答案,否则我宁愿使用“仅存储指针”解决方案。

4

2 回答 2

1

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

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

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

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

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

于 2013-03-16T19:41:23.320 回答
0

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

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

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

于 2013-03-16T19:45:28.820 回答