Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

Предобъявление классов в Object Pascal   Найти похожие ветки 

 
Igor_ ©   (2005-11-30 11:02) [0]

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

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


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

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


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

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

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

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


 
Ega23 ©   (2005-11-30 11:08) [1]



type TParent = class;

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

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


 
Igor_ ©   (2005-11-30 11:13) [2]

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

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


 
TUser ©   (2005-11-30 11:17) [3]

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

type TParent = class;

TChild = class

..
 function getParent: TParent;
..
end;

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


 
Igor_ ©   (2005-11-30 11:22) [4]

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


type TParent = class;

TChild = class
 function getParent: TParent;
end;

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


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

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

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


 
Ega23 ©   (2005-11-30 11:26) [5]


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


На это uses есть.

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


 
evvcom ©   (2005-11-30 11:31) [6]


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

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


 
Igor_ ©   (2005-11-30 11:36) [7]

Красиво куча 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.


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


 
Igor_ ©   (2005-11-30 11:37) [8]

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


 
Igor_ ©   (2005-11-30 11:42) [9]

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

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


 
wal ©   (2005-11-30 11:47) [10]


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

С уважением.


 
TUser ©   (2005-11-30 11:55) [11]

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


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


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

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


 
Ega23 ©   (2005-11-30 12:46) [13]


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


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


 
Igor_ ©   (2005-11-30 12:48) [14]

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


 
Ega23 ©   (2005-11-30 12:51) [15]


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


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


 
Igor_ ©   (2005-11-30 12:53) [16]

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


 
Ega23 ©   (2005-11-30 12:55) [17]


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


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


 
Igor_ ©   (2005-11-30 13:11) [18]

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

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


 
Ega23 ©   (2005-11-30 13:14) [19]

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


 
Igor_ ©   (2005-11-30 13:16) [20]

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



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

Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.017 c
1-1132824219
Tigra
2005-11-24 12:23
2005.12.18
Delphi + MS Word


4-1127981652
BaxTMaH
2005-09-29 12:14
2005.12.18
Русский язык


2-1133285271
STRINGGRID
2005-11-29 20:27
2005.12.18
TABLICA STRINGGRID


2-1133181678
Tihonya
2005-11-28 15:41
2005.12.18
Какую версию транслятора выбрать?


1-1132210437
DimonDimon
2005-11-17 09:53
2005.12.18
Иконки и картинки для кнопок





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский