Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

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

Передача метода класса в качестве параметра для метода другого класса - C++

06.02.2013, 21:31. Просмотров 919. Ответов 2
Метки нет (Все метки)

Здравствуйте,
Передо мной стоит такая задача. Необходимо разработать механизм, который бы мог прервать любую функцию, при этом абсолютна не зная, что за функцию ему передали. Мне ничего лучше в голову не пришло, как создать класс унаследованный от QThread (использую QT, но думаю это не принципиально в данном вопросе), который мог бы получать функцию какого то класса в качестве атрибута и выполнять её в теле run(), выполнение которого он бы уже мог прервать с помощью метода terminate().
Вот какой класс у меня получился:
C++ (Qt)
1
2
3
4
5
6
7
[COLOR=#808000]class[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#800080]Stopper[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000000]:[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#808000]public[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#800080]QThread[/COLOR] [COLOR=#000000]{[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#800080]Q_OBJECT[/COLOR] [COLOR=#808000]public[/COLOR][COLOR=#000000]:[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]explicit[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#800080]Stopper[/COLOR][COLOR=#000000]([/COLOR][COLOR=#800080]QObject[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000000]*[/COLOR]parent[COLOR=#c0c0c0] [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000080]0[/COLOR][COLOR=#000000]);[/COLOR]  [COLOR=#c0c0c0]    [/COLOR][COLOR=#000000]~[/COLOR][COLOR=#000000][I]Stopper[/I][/COLOR][COLOR=#000000]();[/COLOR]  [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000000][I]run[/I][/COLOR][COLOR=#000000]();[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]bool[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#800000]stopProcess[/COLOR][COLOR=#000000];[/COLOR][COLOR=#003900][I][/I][/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR]connectRequest[COLOR=#000000]([/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000000]([/COLOR]*mycallback_f[COLOR=#000000])());[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000000](*[/COLOR][COLOR=#800000]callback_funk[/COLOR][COLOR=#000000])();[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]bool[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#800000]getReq[/COLOR][COLOR=#000000];[/COLOR][COLOR=#808000]signals[/COLOR][COLOR=#000000]:[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR]finished[COLOR=#c0c0c0] [/COLOR][COLOR=#000000]();[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0]    [/COLOR]started[COLOR=#c0c0c0] [/COLOR][COLOR=#000000]();[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR]terminated[COLOR=#c0c0c0] [/COLOR][COLOR=#000000]();[/COLOR]   [COLOR=#808000]public[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#808000]slots[/COLOR][COLOR=#000000]:[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR]stopSignalS[COLOR=#000000]()[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#000000]{[/COLOR] [COLOR=#c0c0c0]     [/COLOR][COLOR=#c0c0c0] [/COLOR]terminate[COLOR=#000000]();[/COLOR][COLOR=#c0c0c0]    [/COLOR][COLOR=#000000]}[/COLOR]    [COLOR=#000000]};
[/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#800080]Stopper[/COLOR][COLOR=#000000]::[/COLOR][COLOR=#000000][I]run[/I][/COLOR][COLOR=#000000]()[/COLOR] [COLOR=#000000]{[/COLOR] [COLOR=#c0c0c0]    [/COLOR][COLOR=#800000]callback_funk[/COLOR][COLOR=#800000][COLOR=#000000]();[/COLOR][/COLOR]//здесь функцию запускаем [COLOR=#000000]}[/COLOR]  [COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#800080]Stopper[/COLOR][COLOR=#000000]::[/COLOR]connectRequest[COLOR=#000000]([/COLOR][COLOR=#808000]void[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]*mycallback_f[/COLOR][COLOR=#000000])())[/COLOR] [COLOR=#000000]{[/COLOR] [COLOR=#c0c0c0]   [/COLOR][COLOR=#800000]callback_funk[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#c0c0c0] [/COLOR][COLOR=#000000]mycallback_f[/COLOR][COLOR=#000000];//здесь мы копируем указатель на функцию[/COLOR] [COLOR=#000000]}
....
[/COLOR]
[COLOR=#000000]connectRequest[COLOR=#000000]([/COLOR][COLOR=#000000][/COLOR][COLOR=#000000][/COLOR][COLOR=#800000]SomeClassPtr[/COLOR][COLOR=#000000]->[/COLOR]SomeFunk[COLOR=#000000]([/COLOR][COLOR=#800000][/COLOR][COLOR=#000000]));//[/COLOR][/COLOR][COLOR=#000000][COLOR=#000000]вот здесь активно ругается компилятор[/COLOR]
....
[/COLOR]
В результате путём различных ухищрений я упёрся в ошибку:
"error C2664: Stopper::connectRequest: невозможно преобразовать параметр 1 из 'void' в 'void (__cdecl *)(void)' Выражение, имеющее тип void, нельзя преобразовать в другой тип"
Насколько я понял изучая эту тему, мне нужно корректно реализовать делегат, но у меня никак не получается это сделать...
Прошу помощи.
Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 21:31     Передача метода класса в качестве параметра для метода другого класса
Посмотрите здесь:

C++ [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc()
C++ двумерный массив в качестве параметра метода класса
C++ Обращение к переменным одного метода из другого внутри класса
C++ Передача enum в качестве аргумента метода класса
Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++) C++
Вызов статического метода из другого класса C++
C++ Передача члена класса в качестве параметра метода
Передача класса в качестве параметра шаблона C++
C++ Вызов метода другого класса
Обрыв функции при вызове метода из объекта другого класса C++
C++ Ошибка при вызове метода класса в методе другого класса
C++ Передача метода класса в качестве аргумента внешней функции

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Algiz
160 / 160 / 13
Регистрация: 23.02.2011
Сообщений: 347
06.02.2013, 21:50     Передача метода класса в качестве параметра для метода другого класса #2
Ты не путай, функцию и метод. Можешь сделать класс, в который тебе нужно это передать шаблонным и передавать в него указатель на экземпляр класса, чей метод нужно вызвать. А вообще, подобные проблемы говорят, об изначально неудачно спроектированной программе. Попробуй найти более простое решение.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.02.2013, 21:57     Передача метода класса в качестве параметра для метода другого класса #3
если сигнатура известна, то можно пользоваться
std::function
boost::function
либо же как в классике замутить все с помощью паттерна Command (Команда) - тут чуть больше приседаний придется сделать, но если буста нет и нового стандарта нет - то это наверно лучшая альтернатива.
Yandex
Объявления
06.02.2013, 21:57     Передача метода класса в качестве параметра для метода другого класса
Ответ Создать тему
Опции темы

Текущее время: 15:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru