您如何从嵌套类的方法中获得基类的“ this”指针?

问题描述 投票:1回答:2

我有一个嵌套在基类中的类,就像这样:

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未声明为静态。这基本上可以,因为方法B将通过执行instanceOfBase.member->methodA()来调用,而方法this将依次调用methodB,但是我遇到的问题是我不知道如何访问指向[的基础instanceOfBase指针。 C0]从其成员对象。

c++ inner-classes this-pointer
2个回答
2
投票

嵌套类的对象没有被无意链接到嵌套其定义的类的对象。请考虑这样的事情:

Base::Nested{}.methodA()

将对哪个Base对象进行操作?

如果您总是Nested对象中包含Base对象,则必须保持该链接。例如,您可以在Base的构造函数中将this对象的Nested指针传递给Base对象的构造函数:

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


2
投票

基类...

“ Base”类表示其他内容。您在问一个outer类。

methodB将通过执行instanceOfBase.member-> methodA()来调用,该方法又会调用methodB,但是我遇到的问题是我不知道如何从其成员访问指向instanceOfBase的基础指针对象。

没有指向instanceOfBase的“基础”指针。结构看起来像这样:

Base ---> Nested
      ^
      |
      pointer

“ Base”不包含任何嵌套对象,但是它指向一个。嵌套不包含任何“基础”对象,也不指向一个对象。由于它不与任何“基础”相关联,因此无法从嵌套对象访问此类“基础”对象。

一种解决方案是在“基础”中提供一个包装器函数,该函数将实例传递给指定的嵌套对象:

class Base {
public:
    // ...
    void methodA() {
        member->methodA(*this);
    }
};
// usage
instanceOfBase.methodA();
© www.soinside.com 2019 - 2024. All rights reserved.