![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли сравнивать типизированные указатели разных типов? [D7, XP]
Очень злой © (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.