Здравствуйте, Frostyland, Вы писали:
F>Здравствуйте. F>Имеется 2 указателя на функции-члены. Можно ли узнать, принадлежат они одному объекту или нет?
Функции-члены относятся к классу, но не к экземпляру класса, так что твой вопрос не имеет смысла. Расскажи подробнее о своей задаче, приведи пример кода, чтобы было понятно — зачем все это нужно.
Любите книгу — источник знаний (с) М.Горький
Re: Как узнать принадлежность указателя на функцию-член?
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Frostyland, Вы писали:
F>>Здравствуйте. F>>Имеется 2 указателя на функции-члены. Можно ли узнать, принадлежат они одному объекту или нет?
B>Функции-члены относятся к классу, но не к экземпляру класса, так что твой вопрос не имеет смысла. Расскажи подробнее о своей задаче, приведи пример кода, чтобы было понятно — зачем все это нужно.
Точно, точно... К классу... Прошу прощения за непродуманный вопрос. Просто так изящно хотелось написать умный связанный лист обработчиков некоего события, чтобы там не было повторов обработчиков из одного и того же объекта...
Вот вкратце как:
Есть событие объекта SomeClassInst->OnMsg.
Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться,
что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.
В BCB имеется структура TMethod, позволяющая отделить котлеты от мух
Здравствуйте, Frostyland, Вы писали:
F>Точно, точно... К классу... Прошу прощения за непродуманный вопрос. Просто так изящно хотелось написать умный связанный лист обработчиков некоего события, чтобы там не было повторов обработчиков из одного и того же объекта...
Можно сделать обертку, которая бы хранила указатель на объект и указатель на функцию-член...
Можно попробовать поискать реализации делегатов для С++...
Любите книгу — источник знаний (с) М.Горький
Re[2]: Как узнать принадлежность указателя на функцию-член?
Здравствуйте, Frostyland, Вы писали:
F>Вот вкратце как:
F>Есть событие объекта SomeClassInst->OnMsg. F>Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться, F>что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.
F>В BCB имеется структура TMethod, позволяющая отделить котлеты от мух F>
Посмотрите в сторону boost::bind и boost::function, возможно их можно сравнивать. Сейчас не вспомню.
В том же дотнете при добавлении новых делегатов-подписчиков на событие дубликаты не проверяются никак.
Re[3]: Как узнать принадлежность указателя на функцию-член?
Здравствуйте, Frostyland, Вы писали:
F>Есть событие объекта SomeClassInst->OnMsg. F>Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться, F>что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.
Не совсем понятно, что обозначает в данном случае "этого же объекта".
Но, по идее, задача решается просто. Надо научиться получать у каждого объекта какое-то ID и его потом сравнивать.
Для очень простых случаев, когда нет множественного наследования, таким ID может быть просто указатель на тот интерфейс, указатель на метод которого мы передаём.
Для чуть более сложных, можно в качестве ID использовать то что вернёт dynamic_cast<void*>( pInst ), для ещё более сложных -- -- надо уточнить что за случай имеется в виду и точно ли это надо поддержать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Как узнать принадлежность указателя на функцию-член?
Здравствуйте, 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]: Как узнать принадлежность указателя на функцию-член?
Здравствуйте, Frostyland, Вы писали:
F>Есть событие объекта SomeClassInst->OnMsg. F>Прежде чем подключить к нему обработчик (SomeClassInst->OnMsg = AnotherClassInst->OnMsgFunc), я хочу убедиться, F>что он не заместит обработчик этого же объекта AnotherClassInst. Именно этого же.
F>В BCB имеется структура TMethod, позволяющая отделить котлеты от мух F>
Тут специфичный для BCB "closure" указатель на метод класса.
Тут m.Data — это this который передается при вызове m.Code.
Соответственно, m.Code — это указатель на код который вызывается.
Здравствуйте, 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>