C , обратные вызовы, объекты и рекомендации

#c #c #qt #callback

#c #c #qt #обратный вызов

Вопрос:

Я ищу решение своей проблемы. Я нашел обходной путь, но я чувствую, что должен быть более красивый способ сделать это. Вот моя проблема: у меня есть библиотека IPC, написанная на C. Когда сообщение получено, оно вызывает функцию обратного вызова. Я создал класс-оболочку для этой библиотеки. При получении сообщения класс-оболочка должен инициировать сигнал (я использую Qt yes). Как вы знаете, функция-член не может быть обратным вызовом, поэтому в моем случае я написал этот обратный вызов вне класса. Теперь я должен передать сигнал из функции обратного вызова, единственный известный мне способ — создать общедоступный метод для класса-оболочки, который будет передавать сигнал, но я не хочу, чтобы этот метод был общедоступным, и я не могу получить доступ к защищенным / закрытым членам вне класса. У кого-нибудь была подобная проблема? Как вы это решили?

Спасибо

Комментарии:

1. Не будет ли работать функция friend, поскольку тогда вам не придется делать свой метод общедоступным? Ссылка

2. @Sim, пожалуйста, оставьте свой комментарий в качестве ответа, чтобы я мог пометить его как ответ 🙂 Большое вам спасибо, я ценю вашу помощь.

Ответ №1:

Вы можете объявить свою внешнюю функцию как друга этого класса, и поэтому вам не нужно будет делать метод общедоступным.

Вот ссылка на учебное пособие.

Отправьте сообщение в качестве ответа, как указано в комментариях.

Ответ №2:

Если вы хотите, чтобы функция-член была «обратным вызовом», вы можете объявить эту функцию в классе как «статическую».

Ответ №3:

Ну, функция-член может быть обратным вызовом с некоторой дополнительной работой. Это то, что называется «делегировать». Вы могли бы попробовать boost::bind / boost::mem_fn . Возможно, некоторые другие библиотеки будут более удобными / полезными, например, boost.lambda (я не пробовал).

Ответ №4:

Std::mem_fun выполняет тот же трюк, что и указал Влад. Создание друзей считается не очень хорошим дизайном, поскольку вы предоставляете потенциальный доступ ко всем внутренним элементам вашего класса, даже не вызывая участника.

Статический метод не сможет выдавать сингал, но он может получить доступ к другому статическому члену, указывающему на ваш класс. Таким образом, вы можете создать специальный класс «вызывающий», хранящий один статический указатель на ваш объект Qt.

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