Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:字段对象是否可以知道其;“家长”;不存储指针?_C++_Pointers_Structure - Fatal编程技术网

C++ C++;:字段对象是否可以知道其;“家长”;不存储指针?

C++ C++;:字段对象是否可以知道其;“家长”;不存储指针?,c++,pointers,structure,C++,Pointers,Structure,假设我有这样的设置: struct XView; struct X { ... XView view; }; TypeXView仅用于此字段;它也是内部的,因此禁止从外部实例化它,即将其用于任何其他用途 >假设C++中的任何对象 xVIEW/COD>类型是 x:视图< /C>字段>,可以从 xVIEW/COD>的地址中找到 x 的地址,完全保持在C++标准定义的行为中,没有类型的双关语?也就是说,是否可以这样做: void XView::some_function () { X

假设我有这样的设置:

struct XView;
struct X
{
  ...
  XView  view;
};
Type
XView
仅用于此字段;它也是内部的,因此禁止从外部实例化它,即将其用于任何其他用途

>假设C++中的任何对象<代码> xVIEW/COD>类型是<代码> x:视图< /C>字段>,可以从<代码> xVIEW/COD>的地址中找到<代码> 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);
}
void XView::一些函数()
{
X&this\u X=重新解释铸件(*this);
}
第二种方法是在
XView
不是
X
的第一个成员时使用偏移量

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


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

第一种方法是使
XView
成为
X
的第一个成员,然后您可以执行以下操作:

void XView::some_function ()
{
   X & this_x = reinterpret_cast<X&>(*this);
}
void XView::一些函数()
{
X&this\u X=重新解释铸件(*this);
}
第二种方法是在
XView
不是
X
的第一个成员时使用偏移量

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


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

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

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


您的代码是否可以重构为更面向对象?(可能使用继承(并使用super::some_函数调用父对象…)

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

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


您的代码是否可以被重构为更面向对象的?(可能还可以使用继承(并使用super::some_函数调用父级…)

@JaredC:我知道
offsetof
,但我不确定在这种情况下我是否可以使用它,而不使用一些丑陋的
reinterpet\u cast
。你不能为此使用继承吗?将
XView
设为
X
的基类,你根本不需要进行任何强制转换。@inslico:不,我必须确保
X;X.view.do\u stuff()
出于兼容性原因而工作。您应该将
视图设置为私有,并设置一个
x。get\u view()
函数。:-)但是,是的,这确实使使用继承成为不可能。@JaredC:我知道
offsetof
,但我不确定在这种情况下,如果没有一些丑陋的
reinterpet\u cast
,我是否可以使用它。你不能为此使用继承吗?将
XView
设为
X
的基类,你就不必进行任何强制转换。@Insico:不,我必须这样做请确保
X;X.view.do_stuff()
出于兼容性原因可以工作。您应该将
view
设置为私有,并将
X.get_view()
函数设置为函数。:-)但这确实使使用继承成为不可能。请参阅编辑。当我写了“定义行为”时,我也没有任何类型的双关语,但是我对C++术语有点生疏,不知道这是否足够。无论如何都要澄清。(我也有不止一种观点。)两种……方法完全相同——不完全相同,使用OffStof应该处理一个指向X.@ DouLeP的虚拟调度表的指针:C++标准实际上明确地允许使用“代码> RealTytCase<代码>在对象指针和指针指向第一个成员之间来回转换,只要它们都是POD。虽然在这种情况下,我不明白为什么不能使用继承。@doublep:请看这个:。。。此外,我还看到@Johannes提到在这种情况下,
reinterpret\u cast
相当于一个由两个
static\u cast
组成的链,这符合标准。@doublep:这是第9.2节第17段,但需要注意的是,所讨论的对象必须是普通的旧数据类型。请参见编辑。当我写了“定义行为”时,我也没有任何类型的双关语,但是我对C++术语有点生疏,不知道这是否足够。无论如何都要澄清。(我也有不止一种观点。)两种……方法完全相同——不完全相同,使用OffStof应该处理一个指向X.@ DouLeP的虚拟调度表的指针:C++标准实际上明确地允许使用“代码> RealTytCase<代码>在对象指针和指针指向第一个成员之间来回转换,只要它们都是POD。虽然在这种情况下,我不明白为什么不能使用继承。@doublep:请看这个:。。。此外,我还看到@Johannes在这种情况下说的
reinterpret\u cast
相当于一个由两个
static\u cast
组成的链,这符合标准。@doublep:这是第9.2节第17段,但需要注意的是,所讨论的对象