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

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

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

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

06.02.2013, 21:31. Просмотров 946. Ответов 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++
Код по сути //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++
Столкнулся со следующей проблемой. Пусть у меня есть некая внешняя функция, которая принимает в качестве аргумента указатель на функцию...

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

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

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

Вызов статического метода из другого класса - C++
Добрый день. Есть MAIN.cpp: STDMETHODIMP CMAIN::Function1(VARIANT Data,BYTE* pBuff) { .......... return x; } И...

Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++) - C++
Всем привет. Пытаюсь написать свой первый демон на C++ по образу и подобию сделанного на PHP. Столкнулся со следующей проблемой. ...

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

Обрыв функции при вызове метода из объекта другого класса - C++
Почему выполнение функция обрывается на вызове метода из объекта другого класса? DataBuffer.cpp //Получаем класс FirstDlg void...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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     Передача метода класса в качестве параметра для метода другого класса
Ответ Создать тему
Опции темы

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