c++ - C++11 有一些可移植且有效的方法来从嵌套类访问封闭类吗?

标签 c++ c++11 nested-class offsetof outer-classes

我需要的可以通过将封闭类的 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/

相关文章:

java - 在 Java 中,嵌套类与其外部类之间的关系是什么?

c++ - 用 c 包装一个 c++ 库? (不要 "extern c")

c++ - 具有浮点值的静态编译时间表

ruby-on-rails - Rails 3 ActiveModel 嵌套类 I18n

c++ - 没有匹配的函数可以调用

c++ - 使用值初始化数组对数据进行零初始化

java - 具有外部类类型参数的内部类

c++ - 明确的概念特化

c++ - 排序数组/文件 I/O C++

c++ - C++ 中的私有(private)方法与 Lambda