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

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

Можно ли сравнивать типизированные указатели разных типов? [D7, XP]


Страницы:   1 2

Очень злой ©   (2011-09-28 22:06:00) 

Возможно очень глупый вопрос, но на дельфи я несколько лет почти ничего не писал, поэтому сейчас почему-то не уверен на 100%.

Допустим:
var
a:TClass1;
b:TClass2;

насколько корректным будет сравнение типа:

if a<>b then ...

?


Cobalt   (2011-09-29 13:28:00) [21]

Дык, по ID надо сравнивать!


DiamondShark   (2011-09-29 11:53:00) [22]


>  Нужно проверить или это не один и тот же объект.

Если у тебя возникла такая задача, а TClass1 и TClass2 не являются предками/потомками друг друга, то у тебя серьёзные проблемы дизайна.
А если они родственники, то и проблемы со сравнением нет никакой.


Игорь Шевченко   (2011-09-29 00:30:00) [23]


> Может потому что оба класса являются родственниками, т.е.
>  один из них наследник наследника (типа внук) другого?


партизан детектед


Очень злой   (2011-09-28 23:50:00) [24]


> У меня выдаёт.


Хм. Проверил с другими типами. Действительно выдает.
Но в моем случае не выдает... Может потому что оба класса являются родственниками, т.е. один из них наследник наследника (типа внук) другого?


Игорь Шевченко   (2011-09-28 23:42:00) [25]


> такого компилятор не выдает


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


oxffff   (2011-09-28 23:26:00) [26]


> насколько корректным будет сравнение типа:
>
> if a<>b then ...
>
> ?


Надо так
if not a.Equals(b) then


Ega23   (2011-09-28 23:12:00) [27]


> такого компилятор не выдает

У меня выдаёт.

> Нужно проверить или это не один и тот же объект.

К Pointer приводи, так проще всего.


Rouse_   (2011-09-28 22:47:00) [28]


>  Ega23 ©   (28.09.11 22:14) [2]
> if @a<>@b then ...

С завтрашнего дня будем плотно заниматься указателями и адресной арифметикой, чейт смотрю ну никак у тебя, вечно белое с холодным путаешь :)


Очень злой   (2011-09-28 22:44:00) [29]


>
> if Pointer(a)<>Pointer(b) then ...


думал что-то типа if a<>TClass1(b), но потом выяснилось, что на  if a<>b then:


> > if a<>b then ...
>
>
> Incompatible types будет.


такого компилятор не выдает, а нормально проглатывает...


Очень злой   (2011-09-28 22:40:00) [30]


> Юрий Зотов ©   (28.09.11 22:13) [1]
>
> Сравниваются адреса объектов a и b. Если это один и тот
> же объект, то будет FALSE, иначе - TRUE.


Собственно это мне и нужно. Нужно проверить или это не один и тот же объект.


Ega23   (2011-09-28 22:33:00) [31]


> Наверное, и здесь придется сделать примерно то же самое.


Ну в связи с новыми вкусностями RTTI, наверное можно и "начинку" сравнить без перекрытия по иерархии "CompareTo". Не уверен, правда, за strict private, а смотреть сейчас лениво.


Ega23   (2011-09-28 22:28:00) [32]


> Но не так: if @a <> @b (поскольку это будет сравнение адресов
> переменных, а не самих объектов).

Да, чё-та ерунду сморозил.


Юрий Зотов   (2011-09-28 22:28:00) [33]


> А зачем так делать?

По-видимому, нужно сравнить "начинку" объектов, а не их адреса. В jav'е для этого предназначены методы equals и compareTo - но в своих класаах их, как правило, приходится перекрывать и писать сравнение ручками (что и естественно). Наверное, и здесь придется сделать примерно то же самое.


Юрий Зотов   (2011-09-28 22:21:00) [34]

Привести к одному типу (Pointer, Cardinal и т.п.) - это само собой.

Но не так: if @a <> @b (поскольку это будет сравнение адресов переменных, а не самих объектов).


Ega23   (2011-09-28 22:14:00) [35]


> if a<>b then ...


Incompatible types будет.

if @a<>@b then ...
или
if Pointer(a)<>Pointer(b) then ...

З.Ы. Сидел, курил, думал. Но практического применения такой конструкции так и не придумал. А зачем так делать?


Юрий Зотов   (2011-09-28 22:13:00) [36]

Сравниваются адреса объектов a и b. Если это один и тот же объект, то будет FALSE, иначе - TRUE.


Страницы:   1 2

Наверх

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