![](/img/trans.png)
[英]Using pointer to inner class object as outer class constructor argument in C++
[英]Get outer object pointer inside inner object
有两个对象: Holder
和Property
。 Holder
包含Property
作为字段。 我想从Property
访问Holder
。 在一般情况下, Property
的地址将是Holder
的地址 + Property
类型字段的偏移量。
但重要的是: Property
不应该有任何字段(例如,我不能将Holder
传递给Property
的构造函数并将其保存为“外部”)。
UPD:我想这个技巧只适用于标准布局。
UPD2:我想使用这种方法(不传递对Property
的引用)的主要原因是在Holder
对象中使用尽可能少的内存。 在最好的情况下: sizeof(Property)
为 0 字节(尽管标准不允许这样做)。
首先,我尝试做的是将指向成员的指针传递给模板参数:
Property<&Holder::prop> prop;
要么
Property<offsetof(Holder, prop)> prop;
但是prop
还没有定义(这是错误的)。
完整的伪代码如下所示:
template<size_t FieldOffset>
class Property
{
class Holder* GetOuter()
{
return (char*)this - FieldOffset; // go to Outer object via offset of our field
}
}
class Holder
{
int Field1;
std::string Field2;
Property<offsetof(Holder, prop)> prop; // Error!
}
还有其他建议可以做类似的事情吗?
只有当类是标准布局且成员是第一个成员时,C++ 中的内存模型才允许从成员子对象导航到它的包含(类类型)对象。 这个想法是,编译器可以推断哪些指针必须转义才能进行写入,从而需要从内存中重新加载一些其他值。 因此,几乎在所有情况下你想要的都是不可能的,尽管有人提议放宽该规则以添加类似这样的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.