![]() |
|
Модераторы: bsa |
![]()
|
|
| Elfet |
|
||||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Приветствую!
Помогите пожалуйста, разобраться с приведение типов указателей функций. Мне нужен callback для отображения процесса в прогрессбаре. Для этого решил делать через указатели на функции:
И вызываю из класса MainWindow:
Но это не работает, видимо мне както нужно преобразовать тип из void (MainWindow::*)(int) в void (*)(int) Расскжите как это можно сделать? Заранее спасибо! |
||||
|
|||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
Elfet, указатель на метод, это не указатель на функцию
Добавлено через 3 минуты и 4 секунды какбэ надо void (MainWindow::*progress)(int) и вызывать как (mainWindowObject->*progress)(123) или использовать bind sflib->CollectSurrounding(5, boost::bind(&MainWindow::Progress,mainWindowObject,_1) ); |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Abyx, ясно. А что это такое bind?
|
|||
|
||||
| niXman |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 4.7.2009 Репутация: нет Всего: 0 |
--------------------
if ( !c++ ) { *power--; this->wussiness += 10;} |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
||||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Мне на bind выдаёт вот это:
|
|||
|
||||
| niXman |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 4.7.2009 Репутация: нет Всего: 0 |
Добавлено @ 19:50
Elfet, Нужно использовать boost: http://www.boost.org/ Это сообщение отредактировал(а) niXman - 23.11.2009, 20:02 --------------------
if ( !c++ ) { *power--; this->wussiness += 10;} |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
||||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
niXman, я буст и использую. Тока вот такую ошибку выдаёт:
|
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
Elfet, покажи минимальный код, необходимый для воспроизведения ошибки =)
(пока будешь его писать - сам найдеш ошибку) или хотябы строчку с bind а то в ошибке явно что-то не то написано |
|||
|
||||
| niXman |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 4.7.2009 Репутация: нет Всего: 0 |
--------------------
if ( !c++ ) { *power--; this->wussiness += 10;} |
|||
|
||||
| Elfet |
|
||||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Функция в классе Mesh из SmartFlowLib:
Вызываю её из MainWindow:
Добавлено через 1 минуту и 49 секунд Нужно короче из одного метода одного класса, вызвать другой метод, др. класса и так что бы они друг о друге на знали ничего. |
||||
|
|||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
а сигнатура MainWindow::Progress как выглядит?
|
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
|
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
сегодня мои телепатические способности на нуле, так что хз где там ошибка.
однако лучшее решение - это сразу писать обобщенный код
|
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Abyx, я вроде весь нужный код-то выложил?
|
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
наверное я был неправ.
результат bind имеет тип, отличный от void(*)(int) так что надо либо использовать указатель на функцию-член, либо шаблон, либо boost::function<void(int)> //или std::tr1:: |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Abyx, а можно поподробнее как использовать шаблон для этого и буст?
|
|||
|
||||
| Abyx |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
Elfet,
шаблон, это
c function это
вариант с шаблоном в общем случае оптимальнее |
||||
|
|||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Я вот такой ещё вариант придумал)))
Добавлено через 2 минуты и 49 секунд Abyx, не совсем понял про вариант с шаблонами... |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
Elfet, у типа Handler в шаблоне будет тип результата bind()
|
|||
|
||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Elfet, по хорошему, прежде чем браться за шаблоны неплохо бы было о них почитать немного...
Но я попытаюсь кратко объяснить... когда ты создаешь шаблон, то компилятор будет пытаться каждый раз при его использовании подстроить под конкретную ситуацию. Например, ты написал шаблон:
В твоем случае, мы задаем параметром шаблона тип объекта, к которому применим operator()(int). Т.е. когда ты пишешь так:
Функции вроде boost::bind (как и std::mem_fun, std::bind1st и пр.) создают функциональные объекты сложных типов (выглядят они жутко), о которых нужно знать только одно - у них есть operator(), который принимает необходимое количество параметром нужного типа. Использовать эти объекты вне шаблонных функций/методов - сущий мазохизм (да и неправильно это)... Но, можно воспользоваться boost::function, которая позволяет сформировать заранее тип функционального объекта, к которому будут автоматически приводиться все совместимые объекты (как реализовано - рассказывать не буду). |
||||||
|
|||||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
bsa, ооо! спасибо!
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |