您如何从嵌套 class 的方法中获取基 class 的 "this" 指针?

How would you the "this" pointer of the base class from a method of a nested class?

我有一个 class 嵌套在基数 class 中,像这样:

class Base {
public:
    void methodB() { std::cout << "method B"; }
    class Nested {
    public:
        void methodA() { methodB(); }
    };
    Nested * member;
};

这显然会产生编译器错误:

Cannot call member function methodB without object

因为 methodB 没有声明为静态的。这在 main 中是可以的,因为 methodB 将通过执行 instanceOfBase.member->methodA() 来调用,这将依次调用 methodB,但我遇到的问题是我不知道如何访问底层 this 从其成员对象指向 instanceOfBase 的指针。

base class ...

"Base" class 有别的意思。你问的是 outer class.

methodB will be called by doing instanceOfBase.member->methodA(), which will in turn call methodB, but the problem I'm encountering is that I don't know how to access the underlying this pointer to instanceOfBase from its member object.

没有 "underlying" 指向 instanceOfBase 的指针。结构如下所示:

Base ---> Nested
      ^
      |
      pointer

"Base" 不包含任何嵌套对象,但它确实指向一个对象。 Nested 不包含任何 "Base" 对象,也不指向任何对象。由于它不与任何 "Base" 相关联,因此无法从嵌套对象访问此类 "Base" 对象。

一种解决方案是在 "Base" 中提供一个包装函数,将实例传递给指定的嵌套对象:

class Base {
public:
    // ...
    void methodA() {
        member->methodA(*this);
    }
};
// usage
instanceOfBase.methodA();

嵌套 class 的对象并没有直接 link 到其定义嵌套的 class 的对象。考虑这样的事情:

Base::Nested{}.methodA()

那个 Base 对象是什么?

如果你有一些不变量,即 Nested 的对象总是包含在 Base 个对象中,那么你必须保持 link。例如,您可以在 Base 的构造函数中将 Base 对象的 this 指针传递给 Nested 对象的构造函数:

class Base {
public:
    class Nested {
    public:
        Nested(Base* owner) : owner{owner} {}
        void methodA() { owner->methodB(); }
        Base* owner;
    };

    Base() : member{this} {}
    void methodB() { std::cout << "method B"; }

    Nested member;
};

Live Demo