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

标签 c++ pointers structure

假设我有这个设置:

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

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

因此,假设XView 类型的任何 对象是一个X::view 字段,是否有可能找到 的地址X 来自 XView 的地址,完全符合 C++ 标准定义的行为并且没有类型双关? IE。是否有可能做这样的事情:

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 的第一个成员时使用偏移量。

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

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

关于C++:字段对象可以在不存储指针的情况下知道它的 "parent"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453809/

相关文章:

xcode - Xcode 中 "Relative to Group"与 "Relative to Project"之间的区别

ios - 以节点为结构的 swift LinkedList

c++ - C++ 中的俄罗斯方 block 对象模型

c++ - 如何删除带有指向其他对象的指针的动态对象数组 (C++)

c++ - 原始(标量)类型的差异复制初始化和直接初始化

c++ - 检查UTF-8是wchar_t还是char?

c - 指向全局 volatile 的静态常量指针

所有指针的 C++ 模板和所有数组的模板

ios - 如何在 touchesBegan : and touchesEnded:? 之间以一致的方式跟踪触摸

c - 指向引用变量的结构元素的指针