Переслать ваш класс.
class Line;
class Shape
{
public:
Line GetTangent();
};
class Line : Shape
{
}
Line Shape::GetTangent()
{
// Do sth
}
C++ требует, чтобы тип был полным, когда он используется. В Shape
вы только уведомляете компилятор, что вы будете использовать класс Line
, но на самом деле вы его не используете. Кроме того, если вы - например, - возвращаете Line *
или Line &
(что в некотором смысле тоже является указателем), оно также должно работать, потому что компилятор будет работать только с указателями (нет необходимости знать, какова цель указателя).
С другой стороны, если вы пытаетесь создать экземпляр Line внутри класса Shape, он не будет работать, потому что C++ не знает, как это линия взгляда, какого рода конструкторы у него есть и скоро. Поэтому для этого вам следует обеспечить реализацию метода GetTangent после всего определения класса Line, как показано в примере.
Это то, что вы получите при попытке использовать линию внутри Shape: http://ideone.com/YQOjQH С другой стороны, если вы извлекаете определение GetTangent снаружи, он будет работать: http://ideone.com/ZrOgdR
Это немного не вопрос, но линии не ударяют меня как естественного ребенка форм. Я бы волновался, что это плохая абстракция. – RichardPlunkett
Согласен. Линия является скорее компонентом фигур, а не специализацией. Формы обычно представляют собой двумерные элементы. –