Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.009 c
15-1218472441
Анонимщики
2008-08-11 20:34
2008.10.05
Шахматы


15-1218549474
Dmitry S
2008-08-12 17:57
2008.10.05
Как выразить битовую операцию or с помощью сложения и умножения?


2-1219955393
dars73
2008-08-29 00:29
2008.10.05
Проблема с записью в RichEdit


2-1219739361
max
2008-08-26 12:29
2008.10.05
String literals may have at most 255 elements


2-1219855868
fokas
2008-08-27 20:51
2008.10.05
Смена FormStyle в run-time пересоздаёт форму




   Наверх