在父类型声明中使用子类型

时间:2013-11-28 09:58:08

标签: c++ oop inheritance

我正在尝试做这样的事情:

class Shape {
    ...
    ...
    ...
    Line GetTangent();
}
class Line:Shape { ... }

它不起作用,因为尚未声明类型Line。 我该怎么办?

2 个答案:

答案 0 :(得分:2)

转发你的课程。

class Line;

class Shape 
{
public:
    Line GetTangent();
};

class Line : Shape
{

}

Line Shape::GetTangent()
{
    // Do sth
}

C ++要求在使用时完成类型。在Shape中,您只通知编译器您将使用Line类,但实际上并未使用它。此外,如果你 - 例如 - 返回Line *Line &(在某种程度上,它也是一个指针),它也应该工作,因为编译器只能使用指针(不需要知道) ,指针的目标是什么。)

另一方面,如果您尝试在Shape类中实例化Line ,它将无法工作,因为C ++不知道, Line 的外观如何,它有什么样的构造函数等等。因此,要实现这一点,您应该在 Line类的整个定义之后提供GetTangent方法的实现,如示例所示。

这是尝试在Shape内使用Line时所获得的:http://ideone.com/YQOjQH 另一方面,如果您在外部提取GetTangent的定义,它将起作用:http://ideone.com/ZrOgdR

答案 1 :(得分:2)

您需要转发声明Line,然后将其从GetTangent等方法作为引用或指针返回。您无法将其返回给我的值,因为编译器不知道如何执行它,因为它没有看到Line的定义。

通过指针或引用返回可能会很麻烦,因此您可能需要重新考虑类层次结构。例如,Line从[{1}}派生Shape更容易让人更容易。