Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Циклическое описание класса, Как с ним бороться 
:(
    Опции темы
bulldog
  Дата 16.9.2003, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.9.2003

Репутация: нет
Всего: нет



Посоветуйте как поступить!!!

Проблема, в упрощенном виде, следующая:
Есть класс А и класс Б, причем класс А содержит свойство - класс Б, а класс Б содержит свойство класс А. Выглядит как-то так:

unit AB;

interface

type
A=class
................
Om:B;
Im:B;
end;

type
B=class
......................
Om:A;
Im:A;
end;


При компиляции возникает проблема: так как 1-м описан класс А, то класса Б компилятор еще не видит, говорит "Тип не известен".

Есть мысль выкрутится указателями, но в пользовании будет не очень удобно, ведь можно было бы указывать А.Б.Свойство, а так прийдется явно заниматься приведением типов.

Поекспериментировал с наследственностью, описал оба класса как потомков от некоторого класса ABMain, а в классе А описал Om как ABMain. В класс А добавил метод

function A.GetOM:ABMain;
begin
result:=B(Self.Om);
end;

Но не смотря на приведение типа метод возвращает объект типа ABMain, вместо ожидаемого B.

Подскажите какие есть выходы в такой ситуацииconfused.gif?

PM MAIL   Вверх
x77
Дата 16.9.2003, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



Код

type
 TB = class;

 TA = class
   B: TB;
 end;

 TB = class
   A: TA;
 end;



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
bulldog
  Дата 16.9.2003, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.9.2003

Репутация: нет
Всего: нет



type
TB = class;
Так попробывал, результат - Error :: Type 'TB' is not yet completely defined
PM MAIL   Вверх
x77
Дата 16.9.2003, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



правильно. потому что кроме TB = class ты ничего больше не написал, дельфя это посчитала forward-декларацией и выматерилась. ниже класс должен быть объявлен полностью.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
bulldog
Дата 17.9.2003, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.9.2003

Репутация: нет
Всего: нет



Ура, заработало!!!!
Спасибо.

Я каждый класс описывал в своей секции type, как только объединил их в одну, откомпилилось без проблем !!!!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.