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

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

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

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

06.02.2013, 21:31. Просмотров 960. Ответов 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++
Добрый день. Интересует следующий вопрос: как передать член класса как параметр по значению в метод того же класса? То есть необходимо,...

[C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() - C++
Пишу программу для обхода бинаронго дерева поиска. Программа написана и кажется даже работает, но только в консоли. Решил выводить...

двумерный массив в качестве параметра метода класса - C++
Добрый день Есть проблемка, попробую упростить условия по максимуму: В программе меется некоторый класс, у этого класса есть метод,...

Указатель на объект в качестве параметра вызываемого метода класса - C++
Код по сути //Interface.cpp #include "Interface.h" void Interface::input() { Teplitsa *kaka; kaka = new Teplitsa; ...

Передача enum в качестве аргумента метода класса - C++
Есть класс //class order; class ticket{ enum type_of_place { coupe, general, berth, wagon_lit }_type_of_place; char*...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Algiz
160 / 160 / 13
Регистрация: 23.02.2011
Сообщений: 347
06.02.2013, 21:50 #2
Ты не путай, функцию и метод. Можешь сделать класс, в который тебе нужно это передать шаблонным и передавать в него указатель на экземпляр класса, чей метод нужно вызвать. А вообще, подобные проблемы говорят, об изначально неудачно спроектированной программе. Попробуй найти более простое решение.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.02.2013, 21:57 #3
если сигнатура известна, то можно пользоваться
std::function
boost::function
либо же как в классике замутить все с помощью паттерна Command (Команда) - тут чуть больше приседаний придется сделать, но если буста нет и нового стандарта нет - то это наверно лучшая альтернатива.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2013, 21:57
Привет! Вот еще темы с ответами:

Вызов метода класса из метода другого класса - C++
Помогите школнегу Имеется несколько классов class Com { protected: unsigned char bufrd, bufwr; unsigned char tx_index,...

Ошибка при вызове метода класса в методе другого класса - C++
Господа программисты, возникла такая проблема. При вызове метода класса в методе другого класса выходит такая ошибка " нестандартный...

Передача класса в качестве параметра шаблона - C++
Имеется два класса, один это однонаправленный итератор, другой это двунаправленный. Двунаправленный получается из однонаправленного. Вот...

Вызов метода другого класса - C++
#include<iostream> using namespace std; class A { public: void Show() { cout << "A" << endl; }; }; class B { ...


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

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

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