Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как сделать forward declaration для record ?


Автор: klimrmad 20.7.2011, 18:34
Дельфи 2007.

Решил воспользоваться записями для облегчения записи векторных операций.
В сильно упрощенном виде выглядит так:
Код

type
tPoint = record
    x, y, z: double;
    class operator Inc( p:tPoint ): tVector;
    class operator Dec( p:tPoint ): tVector;
end;
tVector = record
    x, y, z: double;
    // далее описаны векторные операции, в которых иногда используется tPoint
end;
При компиляции вполне ожидаемо ругается на «Undeclared identifier: 'tVector'»

Пытался, по аналогии с классами, добавить forward declaration:
Код

type
tVector = record;
tPoint = record
    x, y, z: double;
    class operator Inc( p:tPoint ): tVector;
    class operator Dec( p:tPoint ): tVector;
end;
tVector = record
    x, y, z: double;
end;
Ругается на «'END' expected but ';' found»
В мануалах ничего не нарыл. 
Need help.  smile 


Автор: AKATAN 20.7.2011, 19:58
Цитата

type
tVector = record;
tPoint = record
    x, y, z: double;
    class operator Inc( p:tPoint ): tVector;
    class operator Dec( p:tPoint ): tVector;
end;
tVector = record
    x, y, z: double;
end;

 smile 

Цитата

type
tVector = record;
 какой смысл несет этот код? 

Автор: klimrmad 20.7.2011, 20:24
Цитата(AKATAN @ 20.7.2011,  19:58)
Цитата

type
tVector = record;
 какой смысл несет этот код?

В случае с классами таким образом делается forward declaration. 
C record не прокатывает, вот я и спрашиваю, есть ли нормальный путь, или придется использовать некий третий record в качестве прокси.

Автор: AKATAN 20.7.2011, 21:35
Цитата

В случае с классами

ты прав. форвардинг классов бы получился. записей - нет.
столь критично использовать рекордс?

Автор: cat512 21.7.2011, 13:44
Так правильно
Код

type
  PPoint = ^TPoint;
  TVector = record
    x, y, z: double;
    P: PPoint;
  end;

  TPoint = record
    x, y, z: double;
  end;

Автор: klimrmad 21.7.2011, 14:57
Так правильно, если вам надо использовать переменную как поле в записи, а  мне надо его использовать в переназначении операторов.
Этот код при компиляции приводит к ошибке «Incompatible types: 'tVector' and 'pVector'».
Код
type
pVector = ^tVector;
tPoint = record
    x,y,z: double;
    class operator Subtract ( p0,p1:tPoint ): pVector; // Vector = Point - Point
end;
tVector = record
    x,y,z: double;
    class operator Add( p:tPoint;  v:tVector ): tPoint; // Point +- Vector = Point
end;

function Test( p0,p1: tPoint ):double;

implementation

class operator tPoint.Subtract( p0,p1:tPoint ): pVector;
begin
    result.x := p0.x - p1.x;
    result.y := p0.y - p1.y;
    result.z := p0.z - p1.z;
end;

class operator tVector.Add( p:tPoint; v:tVector ): tPoint;
begin
    result.x := p.x + v.x;
    result.y := p.y + v.y;
    result.z := p.z + v.z;
end;

function Test( p0,p1: tPoint ):double;
var
    v: tVector;
begin
    v := p1 - p0;
end;

Автор: cat512 21.7.2011, 15:18
А чем вас такой код не устраивает ?
Код

function Test( p0,p1: tPoint ):double;
var
    P: PVector;
begin
    P := p1 - p0;
//  P^.X
end;



Добавлено через 41 секунду
Можно ещё использовать шаблоны

Добавлено через 2 минуты и 57 секунд
Только не забудьте исправить код и в перегруженных операциях, он у вас неправильный!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)