下面是一个很小的例子。我有一个基类,它需要知道派生类。反过来,派生类需要知道基类。那么,我如何定义他们,使他们知道彼此的存在?
class Base {
Deriving* d;
public:
Base(Deriving* deriving) {
d = deriving;
}
void f() {
d->g();
}
};
class Deriving : public Base {
public:
Deriving() : Base(this) {}
g();
};下面是我尝试过的以及编译器所说的:定义Base首先导致error: 'Deriving' does not name a type。定义Deriving首先导致error: expected class-name before '{' token。声明不完整类型的Base或Deriving将导致error: invalid use of incomplete type 'class X'。我不知道还能尝试什么。
任何帮助都是非常感谢的。
发布于 2016-04-27 21:16:40
在Base中,只有函数f需要知道类Deriving的定义,所以在定义Deriving之后定义它。
class Deriving;
class Base {
Deriving* d;
public:
Base(Deriving* deriving) {
d = deriving;
}
void f();
};
class Deriving : public Base {
public:
Deriving() : Base(this) {}
void g();
};
void Base::f()
{
d->g();
}发布于 2016-04-27 23:43:02
这种安排通常是逻辑上的错误。基类不应该需要知道任何关于派生类的信息。如果基类中的方法需要使用恰好存储在派生类中的资产,那么对这些资产的引用可以传递给函数f()。
在上面的示例中,可以通过继承实现所需的行为:
就像这样:
class Base
{
public:
void f() {
impl_f();
}
private:
virtual void impl_f() = 0;
};
class Derived : public Base
{
private:
void impl_f() override
{
// whatever g() was going to do...
}
};https://stackoverflow.com/questions/36900580
复制相似问题