Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Предобъявление классов в Object Pascal


Igor_ ©   (2005-11-30 11:02:00) 

Как реализовать предобъявление класса?

У меня есть классы типа этого:


type TChild = class
..
   function getParent: TParent;
..
end;

type TParent = class
..
   function childByIndex(i: integer): TChild;
..
end;


Естественно, что на объявлении функции

function TChild.getParent: TParent;
компилятор ругается.

Как предобъявить класс TParent? И возможна ли такая конструкция
в Object Pascal.

Если нет такого понятия как "предобъявить" (я по инету, книжкам,
хелпу искал - не нашел.. Может плохо искал..), то чего-бы такого сделать,
чтобы было и красиво и удобно?


Igor_   (2005-11-30 13:16:00) [1]

Спасибо, Вам того же. :)


Ega23   (2005-11-30 13:14:00) [2]

Всего наилучшего, Igor_


Igor_   (2005-11-30 13:11:00) [3]

Нет, лучше отвечать тупыми ответами. Ни один Ваш ответ не был верным.

Удалят тему.. И правильно сделают..


Ega23   (2005-11-30 12:55:00) [4]


> Это тоже тупо.


Тупые вопросы задавать - тоже тупо?   :о)


Igor_   (2005-11-30 12:53:00) [5]

Это тоже тупо.


Ega23   (2005-11-30 12:51:00) [6]


> Смысла обсуждать какой язык лучше не вижу. Это тупо.


Согласен. Но я и не говорил о том, какой язык лучше. Я говорил о том, какой - хуже.  :о)


Igor_   (2005-11-30 12:48:00) [7]

Смысла обсуждать какой язык лучше не вижу. Это тупо.
Я просто говорил про различия.


Ega23   (2005-11-30 12:46:00) [8]


> а в каком модуле - без разницы.
>


Глупость какая...
Ненавижу С++. Как раз за эти долбаные хидеры.


Igor_   (2005-11-30 12:10:00) [9]


> Модуль - самостоятельная единица со своим интерфейсом. Делать
> каки-либо предположения о том КТО использует этот модуль
> не стоит. А КАК кто-то его использует - польностью описано
> в интерфейсной части. Такая вот идеология. И ничего странного
> и нехорошего я тут как-то не вижу.

Согласен, смысл в этом есть.
Просто я последнее время больше с С++ работал - там это вообще не вопрос. Захотел - предобъявил, хочешь использовать - напиши реализацию, а в каком модуле - без разницы.


TUser   (2005-11-30 11:55:00) [10]

Если вы предопределяете класс, то его описание должно находиться в той же секции type.


wal   (2005-11-30 11:47:00) [11]


> Хотя с модулями все равно как-то нехорошо...
Модуль - самостоятельная единица со своим интерфейсом. Делать каки-либо предположения о том КТО использует этот модуль не стоит. А КАК кто-то его использует - польностью описано в интерфейсной части. Такая вот идеология. И ничего странного и нехорошего я тут как-то не вижу.

С уважением.


Igor_   (2005-11-30 11:42:00) [12]

Спасибо TUser и evvcom.
Стало немного легче жить.

Хотя с модулями все равно как-то нехорошо...


Igor_   (2005-11-30 11:37:00) [13]

2 evvcom ©
Не пройдет. Если используешь предъобъявление класса, то его объявление должно быть в той же секции type.
И по другому не как?


Igor_   (2005-11-30 11:36:00) [14]

Красиво куча type или нет, это дело вкуса.

А вот насчет uses - маленько не выходит:

Если пишу так:

unit u_child;

interface

type TParent = class;

TChild = class
 function getParent: TParent;
end;

implementation

function TChild.getParent: TParent;
begin
   result := Nil;
end;

end.

Ошибка [Error] u_child.pas(5): Type 'TParent' is not yet completely defined

А если так:

unit u_child;

interface
uses
   u_parent;

...

То такая ошибка:
[Fatal Error] u_child.pas(5): Circular unit reference to 'u_child'

При этом модуль u_parent:

unit u_parent;

interface
uses
   u_child;
type
TChild = class;

TParent = class
 function childByIndex(i: integer): TChild;
end;

implementation

function TParent.childByIndex(i: integer): TChild;
begin
   result := Nil;
end;

end.


Что за фигня? И как с этим бороться?


evvcom   (2005-11-30 11:31:00) [15]


> > А что делать, если классы находятся в разных модулях?
>
>
> На это uses есть.

Не пройдет. Если используешь предъобъявление класса, то его объявление должно быть в той же секции type.


Ega23   (2005-11-30 11:26:00) [16]


> А что делать, если классы находятся в разных модулях?


На это uses есть.

А кучу type писать - ИМХО, некрасиво.


Igor_   (2005-11-30 11:22:00) [17]

Не, немножко не так.
Вот так заработало:


type TParent = class;

TChild = class
 function getParent: TParent;
end;

TParent = class
 function childByIndex(i: integer): TChild;
end;


Не думал, что инструкция type играет тут какую-то глубокую роль...

Получается, что если у нас объявления этих классов в одной инструкции
type, то все нормально.

А что делать, если классы находятся в разных модулях?


TUser   (2005-11-30 11:17:00) [18]

Перепиши вот так

type TParent = class;

TChild = class

..
 function getParent: TParent;
..
end;

type TParent = class
..
 function childByIndex(i: integer): TChild;
..
end;


Igor_   (2005-11-30 11:13:00) [19]

На что получаем сообщение компилятора:

[Error] u_some.pas(11): Type 'TParent' is not yet completely defined


Ega23   (2005-11-30 11:08:00) [20]



type TParent = class;

type TChild = class
..
  function getParent: TParent;
..
end;

type TParent = class
..
  function childByIndex(i: integer): TChild;
..
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо