Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.05;
Скачать: CL | DM;

Вниз

Дочерний класс со ссылкой на родителя   Найти похожие ветки 

 
Nucer   (2008-08-21 17:22) [0]

Есть два класса: TField и TRobots.

Файл uField.pas:
unit uField;

interface

uses
 Windows, Messages, SysUtils, Classes, fs_iinterpreter, uRobots;

type

 TField = class(TObject)
   private
    FRobots:TRobots;
    FScript:TfsScript;
   public
    property robots: TRobots read FRobots;
    ...

    constructor Create;
    destructor Destroy; override;
   end;

implementation

constructor TField.Create;
begin
FRobots:=TRobots.Create(self);
end;

destructor TField.Destroy;
begin
FRobots.Free;
FRobots:=nil;
end;

end.


Файл uRobots.pas:
unit uRobots;

interface

uses
 Windows, Messages, SysUtils, Classes;

type

 TField = class(TObject);

 TRobots = class(TObject)
   private
    FField:TField;
    ...
   public
    ...
   
    constructor Create(field:TField);
    destructor Destroy; override;
   end;

implementation

uses uField;

constructor TRobots.Create(field:TField);
begin
FField:=Field;
...
end;

destructor TRobots.Destroy;
begin
...
end;

end.


При компиляции получаю ошибку:
[Error] uField.pas(26): Incompatible types: "uRobots.TField" and "uField.TField"

Как исправить?


 
ЛшдлуттнСфе   (2008-08-21 17:24) [1]

не объявлять лишний раз.


 
stas ©   (2008-08-21 17:27) [2]

А почему не объявить Ufield  вверху?


 
Nucer   (2008-08-21 17:32) [3]

>А почему не объявить Ufield  вверху?
Потому что будет другая ошибка:
[Fatal Error] uField.pas(6): Circular unit reference to "uField"


 
Ega23 ©   (2008-08-21 17:35) [4]

А зачем ты их по разным модулям разносишь? Им самое место быть в едином модуле.


 
Nucer   (2008-08-21 17:39) [5]

>А зачем ты их по разным модулям разносишь? Им самое место быть в едином модуле.

Все равно один класс будет объявлен ниже, и получится "undeclared identifier". Или это как-то можно обойти?


 
stas ©   (2008-08-21 17:41) [6]

там вроде ненадо писать  TField = class(TObject);
а так надо  TField = class;


 
Nucer   (2008-08-21 17:44) [7]

>а так надо  TField = class;
Получаю:
Type "TField" is not yet completely defined


 
stas ©   (2008-08-21 17:45) [8]

У меня так работает, правда все в одном модуле.


 
stas ©   (2008-08-21 17:47) [9]

ниже объяви,то что в другом модуле и будет работать.


 
Nucer   (2008-08-21 17:47) [10]

Да, сейчас проверил, если все скинуть в один модуль и добавить TField = class, то работает. Но хотелось бы разбить на 2 файла, т.к. кода будет много. Этого никак нельзя добиться малой кровью?


 
Ega23 ©   (2008-08-21 17:54) [11]


> Этого никак нельзя добиться малой кровью?


Создать TCustomField, в котором описать те методы, которые будут использоваться в TRobot. Соответственно, TRobot знает только про существование TCustomField.
Ну а ты уже наследуешься от TCustomField в другом юните и переопределяешь (если надо) нужные тебе методы.

З.Ы. А много кода это сколько? 20.000 строк?



Страницы: 1 вся ветка

Текущий архив: 2008.10.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1218274270
king
2008-08-09 13:31
2008.10.05
Опыт работы


2-1219923158
Demo_nik
2008-08-28 15:32
2008.10.05
текстовый файл и Memo поле


11-1193921645
MTsv DN
2007-11-01 15:54
2008.10.05
QProg и KOL v.2.83 (и выше)


2-1219999591
aidyn
2008-08-29 12:46
2008.10.05
работа с 20-значными числами


15-1218560762
blackman
2008-08-12 21:06
2008.10.05
Программистская басня от Эдсгера Дейкстры