我需要的可以通过将封闭类的 this
指针存储到嵌套类中来完成,例如:
class CEnclosing {
public:
class CNested : public CSomeGeneric {
public:
CNested(CEnclosing* e) : m_e(e) {}
virtual void operator=(int i) { m_e->SomeMethod(i); }
CEnclosing* m_e;
};
CNested nested;
CEnclosing() : nested(this) {}
virtual void SomeMethod(int i);
};
int main()
{
CEnclosing e;
e.nested = 123;
return 0;
}
这很好用,但是每个嵌套成员类需要 sizeof(void*)
字节的内存。是否存在无需在 m_e
中存储指向 CEnclosing
实例的指针的有效且可移植的方法?
最佳答案
如前所述,C++ 不提供任何方法来执行此操作。嵌套类没有特殊的方法来找到它的封闭类。您已有的解决方案是推荐的方式。
如果您有高级方案,并且准备维护不可移植的代码,并且如果存储额外指针的成本重要到足以使用有风险的解决方案,那么有一种基于 C++ 对象的方法模型。对于一些我不会涉及的附带条件,您可以依赖以可预测的顺序在内存中布置的封闭类和嵌套类,并且在封闭类和嵌套类的开始之间有一个固定的偏移量。
代码是这样的:
CEnclosing e;
int offset = (char*)&e.nested - (char*)&e;
//... inside nested class
CEnclosing* pencl = (CEnclosing*)((char*)this - offset);
OTOH offsetof 宏也有可能只为您完成,但我还没有尝试过。
如果您真的想这样做,请阅读标准中有关简单可复制和标准布局的内容。
关于c++ - C++11 有一些可移植且有效的方法来从嵌套类访问封闭类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498786/