|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Подводный камень в предварительном описании классов
Недавно пришлось использовать предварительное описание класса, столкнулся с таким вот подводным камнем:
Код:
type // Предварительное описание TTestClass = class; ... // Здесь описаны другие классы ... // Полное описание TTestClass = class(TObject) ... end; Цитата:
Вот пример кода, вызывающего ошибку: Код:
type // Предварительное описание TTestClass = class; // А вот здесь нам захотелось объявить к.л. переменную var x : integer; type // <-- Уже другая секция type // Полное описание TTestClass = class(TObject) ... end; Пишу это другим на будущее, просто это такая мелочь, вроде бы всё правильно написано - а компилятор ругается. А когда читал справку, не сразу заметил, что данная особенность там описана (т.к. просто смотрел на пример кода ) Цитата:
Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#2
|
||||
|
||||
В любом случае нужно стремиться к не к призвольной структуре кода, а к четкой...т.е. все type вместе, все var вместе и все const вместе...
есть определенные правила которых рекомендуется придерживаться... http://www.infocity.kiev.ua/prog/del...elphi185.phtml В начале был Бит, потом Байт и только потом появилось Слово... |
#3
|
||||
|
||||
У меня была несколько иная проблема подобного плана...
Есть основной класс (в отдельном юните), и он должен быть доступен в других юнитах. И есть дополнительные классы, которые использует основной. Они должны быть видимы только "на территории" этого юнита. Код:
type TSomeClass=class; //Предварительное объявление implementation type TSubClass=class ... end; TSomeClass=class ... private t1: TSubClass; ... end; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#4
|
||||
|
||||
А почему не так???
Код:
unit ... interface uses ... type TSomeClass=class; //Предварительное объявление TSubClass=class//Подкласс ... end; TSomeClass=class//Твой класс ... private t1: TSubClass; end; В начале был Бит, потом Байт и только потом появилось Слово... |
#5
|
||||
|
||||
Цитата:
Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#6
|
||||
|
||||
вот определения interface и implementation...
http://www.delphisources.ru/pages/fa...ation.php.html http://www.delphisources.ru/pages/fa...rface.php.html http://www.realcoding.net/article/view/711 Тебе нужно чтобы SubClass был доступен только для SomeClass??? Попробуй SomeClass объявить в interface, а SubClass в implementation.. В начале был Бит, потом Байт и только потом появилось Слово... Последний раз редактировалось NIch, 25.10.2009 в 23:08. |
#7
|
||||
|
||||
ругается в строчке объявления переменной - не видит сабкласс...
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#8
|
||||
|
||||
Код:
type TSomeClass=class; //У меня ругается тут implementation type TSubClass=class ... end; TSomeClass=class ... private t1: TSubClass; ... end; Код:
type TSomeClass=class; Код:
implementation type TSomeClass=class; //Предварительное определение в implementation TSubClass=class ... end; TSomeClass=class ... private t1: TSubClass; ... end; В начале был Бит, потом Байт и только потом появилось Слово... Последний раз редактировалось NIch, 26.10.2009 в 18:47. |
#9
|
||||
|
||||
Читать научись ёмоё!
Цитата:
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#10
|
||||
|
||||
Выражай яснее мысли...
Цитата:
Цитата:
Цитата:
Код:
type TSomeClass=class; //Предварительное объявление implementation type TSubClass=class ... end; TSomeClass=class ... private t1: TSubClass; ... end; В начале был Бит, потом Байт и только потом появилось Слово... |
#11
|
|||
|
|||
Ребят, вы просто не понимаете как устроен dcu.
Если в секции interface ты сказал "А", то уж будь любезен сказать "Б", иначе компилятор не может выдать в другие модули информацию. Это не C++, где хидеры отдельно, а реализация отдельно. Если хочешь таких извращений, то пользуй интерфейсы. |