Форум: "Начинающим";
Текущий архив: 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