2013-11-28 4 views
0

Я пытаюсь сделать что-то вроде этого:Используйте тип ребенка в родительский тип декларации

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

Это не сработало, потому что тип Line еще не был объявлен. Что мне делать?

+1

Это немного не вопрос, но линии не ударяют меня как естественного ребенка форм. Я бы волновался, что это плохая абстракция. – RichardPlunkett

+0

Согласен. Линия является скорее компонентом фигур, а не специализацией. Формы обычно представляют собой двумерные элементы. –

ответ

2

Переслать ваш класс.

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

+3

Я бы не работал, пока GetTanget возвращает строку по значению, а не по ссылке. –

+0

Это потому, что компилятор не знает, сколько стека выделяется для возвращаемого значения? – dutt

+0

@ CătălinPitiş Это нормально, чтобы вернуть неполный тип по значению в функцию * Объявление *. Но любой код, вызывающий его, будет нуждаться в полном определении класса. – juanchopanza

2

Вам необходимо переслать объявите Line, а затем верните его из методов, таких как GetTangent в качестве ссылки или указателя. Вы не можете вернуть это значение, поскольку компилятор не знает, как это сделать, поскольку он не видел определения Line.

Возвращение указателем или ссылкой, вероятно, будет больно, поэтому вам может потребоваться переосмыслить иерархию классов. Например, для praboly будет проще иметь Line от Shape.

Смежные вопросы