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 ...

?


oxffff   (2011-10-03 15:36:00) [1]


> Очень злой   (01.10.11 22:08) [35]
>
> > Однако, топикстартер партизанит :-)
>
>
> Да не партизаню я. Вроде все давно выяснилось, а дискуссии
> (в всевозможных прочих направлениях) продолжаются.


Нет, никакой дискуссии. Сравнивать можно любые типы с любыми.
Просто есть поддержка со стороны RTL языка для определенных пар типов.
Еще есть перегрузка операторов.  

Поэтому утверждающим о проблемах дизайна, я бы рекомендовал посмотреть для начала в зеркало.


Очень злой   (2011-10-01 22:08:00) [2]


> Однако, топикстартер партизанит :-)


Да не партизаню я. Вроде все давно выяснилось, а дискуссии (в всевозможных прочих направлениях) продолжаются.

А мне, как я писал нужно было сравнить являются ли 2 указателя ссылками на один и тот же объект. Просто разных типов они.  Можно было бы привести к одному типу, но компилятор не стал ругаться на сравнение указателей разных типов. Вот поэтому и я задал вопрос. Хотя позже выяснилось что компилятор не ругается из-за того что типы (классы) родственники...


Cobalt   (2011-10-01 18:41:00) [3]

Сравнивать яблоки с апельсинами - мсье знает толк в извращениях.

Однако можно сравнивать нечто общее между разными - например, у килограмма яблок и килограмма апельсин есть общее - вес. Его можно сравнить.

Однако, топикстартер партизанит :-)
Ну и пусть себе партизанит в одиночку.


oxffff   (2011-10-01 14:26:00) [4]


> DiamondShark ©   (30.09.11 23:22) [31]
>
> > oxffff ©   (29.09.11 23:30) [23]
>
> Это какой-то горячечный бред.


Это пример решения задачи в общем виде, когда нужно сравнить экземпляры типов T и U, и которые реализуют интерфейс IStuff и в зависимости от этого
вызвать метод один или два раза.
Причем функции совершенно не важно в одном контейнере они хранятся или в разных.


oxffff   (2011-10-01 14:19:00) [5]


> DiamondShark ©   (30.09.11 23:21) [30]


То есть по твоему чисто технически, функции вида

procedure Check<T:class,ISTuff;U:class,ISTuff>(a:T;b:U);

и в которой нужно сравнить экземпляр типа T и U(причем никаких отношений между типом T и U не установлено) на идентичность в природе существовать не может?


DiamondShark   (2011-09-30 23:22:00) [6]


> oxffff ©   (29.09.11 23:30) [23]

Это какой-то горячечный бред.


DiamondShark   (2011-09-30 23:21:00) [7]


> oxffff ©   (29.09.11 23:16) [20]
> Доказательства будут?

Если нигде не применяются грязные хаки, вида:
b := TClass2(Pointer(a));
то переменные
var
a:TClass1;
b:TClass2;
заведомо никогда не получат одинаковых ссылок.
Очевидно же.

Если грязные хаки применяются, или возникли сомнения в заведомо ложном сравнении, то это называется проблемой дизайна.

Пинцет ваще. Ты бы ещё 2*2=4 попросил доказать.


DiamondShark   (2011-09-30 23:05:00) [8]


> _Юрий   (29.09.11 18:13) [17]
> То есть лист из реализующих общий интерфейс неродственников
> - это проблема дизайна?

Такой лист будет либо листом ТОбжектов (который родственник ВСЕХ объектов), либо листом интерфейсных ссылок.
Никаких сравнений неродственных объектов в реализации такого листа быть не может.


_Юрий   (2011-09-30 20:33:00) [9]


> Игорь Шевченко ©   (30.09.11 19:28) [27]


var  
 instance: TClass1;

это и есть типизированный указатель.
Впрочем, по сабжу вы правы. Таки проблемы дизайна.
В противном случае лист будет состоять из TObject'ов, и получится, что сравниваемые - родственники.


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

_Юрий   (30.09.11 19:25) [26]

Ты слово "типизированных" в названии ветки игнорируешь намеренно ?


_Юрий   (2011-09-30 19:25:00) [11]


> Игорь Шевченко ©   (30.09.11 00:05) [24]


А совсем замечательно было бы, если бы и ты тоже его прочитал бы.
Вопрос был именно про сравнение указателей. Не веришь - прочитай название ветки. Или пост номер [7].
Что касается списка - это  пример ситуации, когда может понадобиться такое сравнение. К вопросу о хорошем или плохом дизайне


Германн   (2011-09-30 00:45:00) [12]


> Было бы неплохо, если бы ты прочитал изначальный вопрос.

А после изначального вопроса было и очень "смутное" уточнение"
> Нужно проверить или это не один и тот же объект.

Сам же говорил про "партизанов". :)


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

_Юрий   (29.09.11 19:25) [19]

Было бы неплохо, если бы ты прочитал изначальный вопрос. "Сравнить указатели, чтобы выкинуть из списка" и "сравнить экземпляры, как у автора в вопросе", это слегка разные сравнения, нес па ?


oxffff   (2011-09-29 23:30:00) [14]

Вот пример такого сравнения, кстати он выявляет баг компилятора, а точнее правила отношения между типами неправильные, либо намеренно сделаны послабления для бинарных операторов для type parameter.

ISTuff=interface
procedure stuff;
end;

TA=class(TinterfacedObject,ISTuff)
procedure stuff;
end;

TB=class(TContainedObject,ISTuff)
procedure stuff;
end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 procedure Check<T:class,ISTuff;U:class,ISTuff>(a:T;b:U);
 end;

{ TB }

procedure TB.stuff;
begin

end;

{ TA }

procedure TA.stuff;
begin

end;

{ TForm1 }

procedure TForm1.Check<T, U>(a: T; b: U);
begin
if a=b then               //<-баг здесь. Ошибку компилятор не показывает.
 begin
 a.stuff;
 end
 else
 begin
 a.stuff;
 b.stuff;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var a:TA;
   b:TB;
begin
//if a=b then  <-ошибка компиляции

Check<TA,TB>(a,b);
end;


oxffff   (2011-09-29 23:25:00) [15]

Если интересно, то можете почитать по теории типов про бинарные операции и рекурсивные типы.


oxffff   (2011-09-29 23:17:00) [16]


> Игорь Шевченко ©   (29.09.11 18:33) [18]
> _Юрий   (29.09.11 18:13) [17]
>
> Если при этом требуется сравнение экземпляров классов то
> таки да, проблема дизайна


Доказательства будут?


oxffff   (2011-09-29 23:16:00) [17]


> DiamondShark ©   (29.09.11 11:53) [15]
>
> >  Нужно проверить или это не один и тот же объект.
>
> Если у тебя возникла такая задача, а TClass1 и TClass2 не
> являются предками/потомками друг друга, то у тебя серьёзные
> проблемы дизайна.


Доказательства будут?


_Юрий   (2011-09-29 19:25:00) [18]


> Игорь Шевченко ©   (29.09.11 18:33) [18]


а как выкинуть объект из списка без сравнения указателей?


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

_Юрий   (29.09.11 18:13) [17]

Если при этом требуется сравнение экземпляров классов то таки да, проблема дизайна


_Юрий   (2011-09-29 18:13:00) [20]


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


То есть лист из реализующих общий интерфейс неродственников - это проблема дизайна?


Страницы:   1 2

Наверх

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