我有一个嵌套在基类中的类,就像这样:
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]从其成员对象。
嵌套类的对象没有被无意链接到嵌套其定义的类的对象。请考虑这样的事情:
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;
};
基类...
“ Base”类表示其他内容。您在问一个outer类。
methodB将通过执行instanceOfBase.member-> methodA()来调用,该方法又会调用methodB,但是我遇到的问题是我不知道如何从其成员访问指向instanceOfBase的基础指针对象。
没有指向instanceOfBase的“基础”指针。结构看起来像这样:
Base ---> Nested
^
|
pointer
“ Base”不包含任何嵌套对象,但是它指向一个。嵌套不包含任何“基础”对象,也不指向一个对象。由于它不与任何“基础”相关联,因此无法从嵌套对象访问此类“基础”对象。
一种解决方案是在“基础”中提供一个包装器函数,该函数将实例传递给指定的嵌套对象:
class Base {
public:
// ...
void methodA() {
member->methodA(*this);
}
};
// usage
instanceOfBase.methodA();