派生类的前向声明

Forward declaration of derived class

本文关键字:声明 派生      更新时间:2023-10-16

我有一些这样的代码:

class Class1 {
    // some code here
    Class2 inverse() {
        // some code here
    }
};
class Class2 : public Class1 {
    // some code here
};

我得到一个错误,Class2在函数inverse中是未知的。我可以声明这个类吗?如何声明?

Class2可以在Class1之前转发声明。然后,您必须将inverse函数声明与定义分开。所以你应该定义它在Class2被定义之后:

class Class2;
class Class1 {
// some code here
Class2 inverse();
};
class Class2: public Class1 {
// some code here
};
Class2 Class1::inverse()
{
    return Class2();
}

但是,老实说,这是糟糕的设计。

到达Class2 inverse()时没有定义Class2,所以即使前向声明也不能完全解决这个问题。然而,你可以做两件事。返回指向Class2

的指针或引用。
class Class2;
^^^^^^^^^^^^
class Class1 {    
    Class2& inverse() {
    //   ^^^ or possibly Class2*
       // 
    }
};
class Class2: public Class1 {
}

或者在Class2完全定义之后定义inverse

class Class2;
class Class1 {
   Class2 inverse(); 
};
class Class2: public Class1 {
   // 
}
Class2 Class1::inverse() {
    // 
}

如果可能的话,我会选择第二个选项。