Как узнать принадлежность указателя на функцию-член?
От: Frostyland  
Дата: 30.09.09 04:32
Оценка:
Здравствуйте.
Имеется 2 указателя на функции-члены. Можно ли узнать, принадлежат они одному объекту или нет?

С уважением, ВВК
С уважением, В.Куликов
Re: Как узнать принадлежность указателя на функцию-член?
От: Bell Россия  
Дата: 30.09.09 04:39
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Здравствуйте.

F>Имеется 2 указателя на функции-члены. Можно ли узнать, принадлежат они одному объекту или нет?

Функции-члены относятся к классу, но не к экземпляру класса, так что твой вопрос не имеет смысла. Расскажи подробнее о своей задаче, приведи пример кода, чтобы было понятно — зачем все это нужно.
Любите книгу — источник знаний (с) М.Горький
Re: Как узнать принадлежность указателя на функцию-член?
От: jazzer Россия Skype: enerjazzer
Дата: 30.09.09 04:43
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Здравствуйте.

F>Имеется 2 указателя на функции-члены. Можно ли узнать, принадлежат они одному объекту или нет?

указатели на функции-члены не принадлежат никакому объекту, вспомни синтаксис.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Как узнать принадлежность указателя на функцию-член?
От: Frostyland  
Дата: 30.09.09 05:18
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Frostyland, Вы писали:


F>>Здравствуйте.

F>>Имеется 2 указателя на функции-члены. Можно ли узнать, принадлежат они одному объекту или нет?

B>Функции-члены относятся к классу, но не к экземпляру класса, так что твой вопрос не имеет смысла. Расскажи подробнее о своей задаче, приведи пример кода, чтобы было понятно — зачем все это нужно.


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

Вот вкратце как:

Есть событие объекта SomeClassInst->OnMsg.
Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться,
что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.

В BCB имеется структура TMethod, позволяющая отделить котлеты от мух
  TMethod m = *(TMethod*)&(SomeClassInst->OnMsg);
  void* d1 = m.Data;
  void* d2 = m.Code;


Поле конечно же принадлежит объекту, в отличие от функции-члена... Увы ))
С уважением, В.Куликов
Re: Как узнать принадлежность указателя на функцию-член?
От: igna Россия  
Дата: 30.09.09 06:46
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Имеется 2 указателя на функции-члены. Можно ли узнать, принадлежат они одному объекту или нет?


Нет. Это все равно, что спрашивать, "принадлежат" ли одному массиву два имеющихся индекса.
Re[3]: Как узнать принадлежность указателя на функцию-член?
От: Bell Россия  
Дата: 30.09.09 06:46
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Точно, точно... К классу... Прошу прощения за непродуманный вопрос. Просто так изящно хотелось написать умный связанный лист обработчиков некоего события, чтобы там не было повторов обработчиков из одного и того же объекта...


Можно сделать обертку, которая бы хранила указатель на объект и указатель на функцию-член...
Можно попробовать поискать реализации делегатов для С++...
Любите книгу — источник знаний (с) М.Горький
Re[2]: Как узнать принадлежность указателя на функцию-член?
От: Pavel Dvorkin Россия  
Дата: 30.09.09 11:24
Оценка:
Здравствуйте, igna, Вы писали:

I>Нет. Это все равно, что спрашивать, "принадлежат" ли одному массиву два имеющихся индекса.


Если известен указатель на массив и его длина — можно и ответить
With best regards
Pavel Dvorkin
Re[3]: Как узнать принадлежность указателя на функцию-член?
От: Pavel Dvorkin Россия  
Дата: 30.09.09 11:25
Оценка:
Сорри. Не так понял. Если просто про индексы — нет, конечно, ты прав.
With best regards
Pavel Dvorkin
Re[3]: Как узнать принадлежность указателя на функцию-член?
От: Мишень-сан  
Дата: 01.10.09 17:47
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Вот вкратце как:


F>Есть событие объекта SomeClassInst->OnMsg.

F>Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться,
F>что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.

F>В BCB имеется структура TMethod, позволяющая отделить котлеты от мух

F>
F>  TMethod m = *(TMethod*)&(SomeClassInst->OnMsg);
F>  void* d1 = m.Data;
F>  void* d2 = m.Code; 
F>


Посмотрите в сторону boost::bind и boost::function, возможно их можно сравнивать. Сейчас не вспомню.
В том же дотнете при добавлении новых делегатов-подписчиков на событие дубликаты не проверяются никак.
Re[3]: Как узнать принадлежность указателя на функцию-член?
От: Erop Россия  
Дата: 01.10.09 20:26
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Есть событие объекта SomeClassInst->OnMsg.

F>Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться,
F>что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.

Не совсем понятно, что обозначает в данном случае "этого же объекта".
Но, по идее, задача решается просто. Надо научиться получать у каждого объекта какое-то ID и его потом сравнивать.
Для очень простых случаев, когда нет множественного наследования, таким ID может быть просто указатель на тот интерфейс, указатель на метод которого мы передаём.
Для чуть более сложных, можно в качестве ID использовать то что вернёт dynamic_cast<void*>( pInst ), для ещё более сложных -- -- надо уточнить что за случай имеется в виду и точно ли это надо поддержать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Как узнать принадлежность указателя на функцию-член?
От: Frostyland  
Дата: 02.10.09 08:35
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Frostyland, Вы писали:


F>>Есть событие объекта SomeClassInst->OnMsg.

F>>Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться,
F>>что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.

E>Не совсем понятно, что обозначает в данном случае "этого же объекта".

Имеется в виду вот что:
Есть объект Handler, который подписался на событие объекта Sender->OnXXX: Sender->OnXXX = Handler->Func1;
"Забыв" об этом, он снова подписывается на это же событие чуть позже: Sender->OnXXX = Handler->Func2;
Все бы ничего, но по правилам хорошего тона я храню очередь подписки, подключая к ней новые обработчики в конец. И вот теперь одно и то же событие обрабатывается у меня в объекте дважды. И, в моем случае, дважды выводится в лог одна и та же строчка (Handler — объект-журнал)
С уважением, В.Куликов
Re[3]: Как узнать принадлежность указателя на функцию-член?
От: s.ts  
Дата: 09.10.09 15:28
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Есть событие объекта SomeClassInst->OnMsg.

F>Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться,
F>что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.

F>В BCB имеется структура TMethod, позволяющая отделить котлеты от мух

F>
F>  TMethod m = *(TMethod*)&(SomeClassInst->OnMsg);
F>  void* d1 = m.Data;
F>  void* d2 = m.Code; 
F>


Тут специфичный для BCB "closure" указатель на метод класса.
Тут m.Data — это this который передается при вызове m.Code.
Соответственно, m.Code — это указатель на код который вызывается.

в общем, что-то типа этого:
  TMethod m1 = *(TMethod*)&(SomeClassInst->OnMsg);
  TObject* data1 = (TObject*)m1.Data;
  TMethod m2 = *(TMethod*)&(AnotherClassInst->OnMsgFunc);
  TObject* data2 = (TObject*)m2.Data;
  if ( data1->ClassType() != data2->ClassType() )
    SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc;
Re[3]: Как узнать принадлежность указателя на функцию-член?
От: s.ts  
Дата: 09.10.09 15:34
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, Frostyland, Вы писали:


F>>>Здравствуйте.

F>>>Имеется 2 указателя на функции-члены. Можно ли узнать, принадлежат они одному объекту или нет?

B>>Функции-члены относятся к классу, но не к экземпляру класса, так что твой вопрос не имеет смысла. Расскажи подробнее о своей задаче, приведи пример кода, чтобы было понятно — зачем все это нужно.


F>Точно, точно... К классу... Прошу прощения за непродуманный вопрос. Просто так изящно хотелось написать умный связанный лист обработчиков некоего события, чтобы там не было повторов обработчиков из одного и того же объекта...


Надо было сразу сказать, что используется специфика BCB.
Так что эти указатели относятся все же к объекту
Тут "closure" указатели на метод объекта, а не на метод класса.
Этого указателя достаточно для вызова, т.е. this содержится у него внутри.


F>Вот вкратце как:


F>Есть событие объекта SomeClassInst->OnMsg.

F>Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться,
F>что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.

F>В BCB имеется структура TMethod, позволяющая отделить котлеты от мух

F>
F>  TMethod m = *(TMethod*)&(SomeClassInst->OnMsg);
F>  void* d1 = m.Data;
F>  void* d2 = m.Code; 
F>


F>Поле конечно же принадлежит объекту, в отличие от функции-члена... Увы ))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.