您如何从嵌套 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;
};
我有一个 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;
};