Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Inversus
0 / 0 / 0
Регистрация: 28.08.2016
Сообщений: 12
#1

Передача указателя на функцию-член - C++

29.08.2016, 00:05. Просмотров 1363. Ответов 41
Метки нет (Все метки)

Всем привет !

Необходимо передать функцию-член в качестве параметра другой функции-члену. Следующий код

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Menu {
    public:
    void spin();   
};
void Menu::spin() {
  ;
}
class Encoder {
  public:
    void setSpinFunc(void(Menu::*i)());
};
void Encoder::setSpinFunc(void(Menu::*i)()) {
  ;
}
int main()
{
    Menu m();
    Encoder e();
    e.setSpinFunc(m.spin);
}
вызывает ошибку: request for member 'setSpinFunc' in 'e', which is of non-class type 'Encoder()'

Уже долго туплю над этим, похоже сам не въеду, разъясните что не так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2016, 00:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача указателя на функцию-член (C++):

Передача типа указателя на функцию - C++
Всем привет. Недавно в теме начинающих возник вопрос, а можно ли передать тип (указатель на функцию) без использования typedef: ...

Шаблон RAII замены указателя на функцию - C++
шаблон raii замены указателя на фукнцию допустим имеется набор указателей на функции разных типов и существует потребность временно,...

Вызов через указатель на функцию-член - C++
Всем экспертам привет :) Разбавим раздел, так сказать. Задался тут таким вопросом: Есть класс, в котором объявлено поле типа...

Ошибка Access violation при передаче указателя в функцию - C++
выделяю память для нужд програмных и соханяю его. char *resadres =(char*) VirtualAlloc (0, 50000, MEM_COMMIT | MEM_RESERVE,...

Передача ссылки в функцию в DLL - C++
Здравствуйте. По этому мануалу сделал DLL https://msdn.microsoft.com/ru-ru/library/ms235636.aspx Возникла проблема с передачей...

Передача и возврат указателя из массива - C++ Builder
Доброго времени суток. проблема с указателями как я догадываюсь. функция im исправно работает исправно но при объединение с...

41
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,133
Записей в блоге: 17
29.08.2016, 23:03 #16
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Хорошие вещи быстро не делаются. И без боков не делаются.
Ну явно не пятилетками, это все же IT - либо вовремя либо никогда.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Это не значит что при обработке данных сервом и консолькой не нужны делегаты или не возможно преимущественно визуальное проектирование ливера этих сервов.
Например, зачем это нужно в коде сервера или консольке?

Добавлено через 3 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
К примеру TDataModule в С++ Builder тоже GUI не касается. Но тем не менее компоненты которые в нем размещаются тоже связываются и настраиваются преимущественно визуально.
Нарушая при этом инкапсуляцию. Это как раз беда билдера.
Для работы с БД это еще более или менее...
Но для работы к примеру в потоке все равно придется создавать и настраивать компоненты в коде.
0
Fulcrum_013
Заблокирован
29.08.2016, 23:06 #17
Цитата Сообщение от Avazart Посмотреть сообщение
Например, зачем это нужно в коде сервера?
Пример - на сокет пришла информация. Необходимо оповестить обрабатывающий контекст. Сокет отправил данные. Тоже надо контекст оповестить. Коннект опять же нужно контекст оповестить. Дисконнет то же самое. Не кажется ли что все это внутри одного процесса удобнее делать через делегата чем через мессаджи? А даже если и через мессаджи то подписку на получение события из системы диспетчеризации сообщений тоже удобно через делегаты делать. Ну и так вобщем на каждом шагу. Чем больше взаимосвязей между объектами информационой модели тем от большего головняка при проектировании иерархии избавляют делегаты.
0
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,133
Записей в блоге: 17
29.08.2016, 23:09 #18
А вы гляньте в boost/asio. Я не вижу такую необходимости.
0
Fulcrum_013
Заблокирован
29.08.2016, 23:18 #19
Цитата Сообщение от Avazart Посмотреть сообщение
Нарушая при этом инкапсуляцию.
Что конкретно подразумевается под нарушением инкапсуляции? Да кстати очень часто нарушение инкапсуляции дает абсолютную инкапсуляцию на более высоком уровне. (Сокрытие и обеспечение невмешательства извне в механизм взаимодействия объектов двух или нескольких классов)
Как на меня нарушение инкапсуляции это к примеру публичные а не протектед геттеры и сеттеры.

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Я не вижу такую необходимости
Если контексты-обработчики объекты то необходимость такая есть как бы механизм ее реализации не был организован. К примеру можно костылить через std и лямбды, можно через статик методы - посредники и передачу багажом контекста, а можно через нативную поддержку делегата который в принципе делает то же самое только с гораздо более удобным синтаксисом и гораздо меньшим количеством кода.
0
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,133
Записей в блоге: 17
29.08.2016, 23:20 #20
К примеру что мешает сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void AbstractMenu
{
    public:
        virtual void spin()=0;   
};
 
 
class Menu: public AbstractMenu
{
    public:
    virtual void spin();   
};
 
 
void Menu::spin() 
{
};
 
 
class Encoder {
  public:
    void setSpinFunc(AbstractMenu* menu);
};
void Encoder::setSpinFunc(AbstractMenu* menu) 
{
     menu->spin();
}
int main()
{
    Menu m();
    Encoder e();
    e.setSpinFunc(&m);
}
Добавлено через 1 минуту
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Что конкретно подразумевается под нарушением инкапсуляции?
Компоненты видны "снаружи" модуля, так как находятся в секции __published
1
Fulcrum_013
Заблокирован
30.08.2016, 02:49 #21
Цитата Сообщение от Avazart Посмотреть сообщение
К примеру что мешает сделать так:
Ну не мешает то в принципе ничего. Только требует чтобы класс Encoder знал спецификацию класса AbstractMenu. Делегат же этого не требует а делает то же самое, что и избавляет от кучи головняка при проектировниии иерархии.

Добавлено через 16 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Компоненты видны "снаружи" модуля, так как находятся в секции __published
Не смертельно. В некоторых ООП языках вообще в начале их существования закрытых секций не было. Хотя действительно стоило бы разделить модификатор видимости и модификатор "доступен для визуального редактировния". Они по сути описывают независимые друг от друга переключатели. Хотя это и потянет за собой некоторые неоднозначности в плане а что именно сереализировать/десериализировать и опять же в доступе внешнего сериализатора/десериализатора к компонентам в защищенных областях. Хотя в принципе и это разруливается.

Добавлено через 58 минут
Цитата Сообщение от Avazart Посмотреть сообщение
К примеру что мешает сделать так:
Да кстати при всем при этом нативный (поддерживаемый компилятором) делегат будет работать быстрее. Т.к. для нативного делегата VMT-lookup осуществляется в момент инициализации, а для любого из возможных костылей на эту тему в момент вызова.

Добавлено через 18 минут
Цитата Сообщение от Avazart Посмотреть сообщение
MSVC продвигает давно C# у которого "включено"
Визуальное там только формошлепство да и то до Билдеровского в этом плане не дотягивает. А в том что касается не формошлепства мусоросборник мешает. Просто предпочитаю объекты делать фунциклящие по принципу по принципу "создал настроил добавил в иерархию и забыл". Когда как и что ему делать включая удаление объект знает сам.

Добавлено через 6 минут
А шарп это на самом деле улучшенная Java, адаптированная к КОП и визуальному формошлепству а не улучшенный C++ (назван так потому как Sun был категорически против внесения изменений и расширений в спецификацию Java)).

Добавлено через 1 час 37 минут
Цитата Сообщение от Avazart Посмотреть сообщение
MSVC продвигает давно C# у которого "включено".
Кстати так же включено в Visual C++.NET , есть в С++ Builder, есть в Qt в общем везде есть механизмы на тему делегатов свойств и RTTI кроме стандарта. А есть потому как нужны для реализации компонентно-ориентированной парадигмы.
0
pav1uxa
1847 / 1700 / 644
Регистрация: 23.01.2014
Сообщений: 6,079
Завершенные тесты: 1
30.08.2016, 09:12 #22
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Визуальное там только формошлепство
А что должно быть?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
и то до Билдеровского в этом плане не дотягивает
Что имеется ввиду?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Просто предпочитаю объекты делать фунциклящие по принципу по принципу "создал настроил добавил в иерархию и забыл". Когда как и что ему делать включая удаление объект знает сам.
А в C# (.NET) и Qt Вы хотите сказать не так?
0
Fulcrum_013
Заблокирован
30.08.2016, 10:11 #23
Цитата Сообщение от pav1uxa Посмотреть сообщение
А что должно быть?
Ну хотя бы какая то работа с ливером (Инет/БД/сокеты/сенсоры/акции/перехват сообщений ОС) с возможностью расширения набора. Это как минимум для того чтобы эта штука вообще могла называться средством визуальной разработки.
Цитата Сообщение от pav1uxa Посмотреть сообщение
Что имеется ввиду?
Ну как минимум набор компонентов.
Цитата Сообщение от pav1uxa Посмотреть сообщение
А в C# (.NET) и Qt Вы хотите сказать не так?
В Qt это тоже возможно, это ведь все таки С++. А в шарпе мусоросборник мешает, потому как мусоросборник некоторые проблемы лечит отрубая голову. К примеру недопущение висячих ссылок путем неудаления объекта на который они есть. Принудительное удаление /самоудаление объекта на который имеются ссылки с вычисткой ссылок из всех содержащих их списков в шарпе будет реализовать куда как потруднее чем в С++, а тем более будет совсем не на пользу скорости работы сборщика мусора которому и так в разветвленном дереве с паритетными связями живется несладко (если большинство этих ссылок еще и двунаправленными будут ему совсем поплохеет). А бывают такие задачки когда объект должен не просто ссылки считать но и типы тех кто на него ссылается, и при нарушении минимально допустимого комплекта ссылок удаляться, оповещая ссылающихся, некоторые из которых сего тоже могут не пережить. От мусоросборщика при этом толку ноль а геммороя из за отсутствия деструкторов куда больше. А в С++ (в том числе в Qt) это всего лишь оверхед по памяти на указатели до 3,5 раз и не более.
0
pav1uxa
1847 / 1700 / 644
Регистрация: 23.01.2014
Сообщений: 6,079
Завершенные тесты: 1
30.08.2016, 10:30 #24
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну хотя бы какая то работа с ливером (Инет/БД/сокеты/сенсоры/акции/перехват сообщений ОС) с возможностью расширения набора. Это как минимум для того чтобы эта штука вообще могла называться средством визуальной разработки.
Конкретизируйте.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну как минимум набор компонентов.
Конкретизируйте.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
а геммороя из за отсутствия деструкторов куда больше
Есть Dispose()
0
Fulcrum_013
Заблокирован
30.08.2016, 11:13 #25
Цитата Сообщение от pav1uxa Посмотреть сообщение
Конкретизируйте.
Ну если конкретно то в комплекте с билдером вкладок (разделов) компонент больше чем список компонент с шарпом. Из них процентов 90 не визуальные, а обеспечивающие работу с БД, сокетами, протоколами интернета (как клиентские так и серверные), облаком, REST-серверами, датчиками, сообщениями ОС и т.д. и т.п, Которые тоже визуально настраиваются и связываются между собой.

Добавлено через 16 минут
Цитата Сообщение от pav1uxa Посмотреть сообщение
Есть Dispose()
Ну то понятно что делается метод и вместо удаления именно он и вызывается, делая то же что и деструктор. Но при этом объект накапливает ссылки на всех кто на него ссылается. т.е. получается хранит динамический массив или связный список обратных ссылок (круговых), что достаточно сильно будет затормаживать сборщик памяти на разветвленной структуре, при этом чем больше паритетных связей (связи не узел-дочерний узел) тем труднее будет разгрести все это сборщику мусора, при том что он тратит время на обход всей этой структуры по всем циклам графа связей при каждой уборке а не один раз при удалении, да и то от эпицентра удаления до ближайших выживших.
0
Dmitriy_M
1363 / 1246 / 114
Регистрация: 20.03.2009
Сообщений: 4,462
Записей в блоге: 11
31.08.2016, 17:52 #26
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну если конкретно то в комплекте с билдером вкладок (разделов) компонент больше чем список компонент с шарпом. Из них процентов 90 не визуальные, а обеспечивающие работу с БД, сокетами, протоколами интернета (как клиентские так и серверные), облаком, REST-серверами, датчиками, сообщениями ОС и т.д. и т.п, Которые тоже визуально настраиваются и связываются между собой.
То же мне визуальная разработка.
0
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,133
Записей в блоге: 17
31.08.2016, 18:31 #27
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
То же мне визуальная разработка.
Ну из нового добавили такое средство LiveBindings

Видео




Но я как бы не просек фишку пока. Какой от нее прок...
0
Fulcrum_013
Заблокирован
31.08.2016, 18:57 #28
Цитата Сообщение от Avazart Посмотреть сообщение
Какой от нее прок...
Дата биндинг. Большинство переключений состояний и занесения данных из контрола в контрол теперь можно не кодом делать а схемой.
0
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,133
Записей в блоге: 17
31.08.2016, 19:00 #29
Да только толку с этого ноль...
0
Fulcrum_013
Заблокирован
31.08.2016, 19:06 #30
Цитата Сообщение от Avazart Посмотреть сообщение
Да только толку с этого ноль...
Толку в этом ускорение разработки GUI. Там где GUI огромные и имеют множество настроек будет очень даже заметно.
Они все таки в этом плане на крупные и сверхкрупные корпоративные хеллоуверды ориентированы а не на просто хеллоуверды.
0
31.08.2016, 19:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2016, 19:06
Привет! Вот еще темы с ответами:

Передача указателя на объект класса через this - C++ Builder
Всем участникам форума горячий ПРИВЕТ! Вопрос такой. cl.h class cl { public: void cl(); int a; private: DWORD...

Передача указателя на функцию-член класса - C++
Необходимо передать фунцию-член класса как аргумент в функцию другого класса. Код: Файл main.cpp #include "head.hpp" int...

Передача указателя на шаблонную функцию в другую функцию - C++
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

Передача указателя в функцию - C++
Здравствуйте. Прошу помощи, сижу уже пару часов читаю мануалы, но так и не смог до конца понять, что мне делать. Есть вот такой код: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.