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

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

Войти
Регистрация
Восстановить пароль
 
 
Abraziv__
-52 / 3 / 0
Регистрация: 05.02.2013
Сообщений: 372
#1

Передать указатель метода в функцию С++ - C++

05.04.2014, 16:07. Просмотров 396. Ответов 15
Метки нет (Все метки)

Пишу простейшее сетевое приложение.
Оформил всё в одном классе. Далее подключил этот класс к диалоговому.

Есть некоторая функция:
void transmit::dispatcher_handler(u_char *param,const struct pcap_pkthdr *header, const u_char *packet);
Находится она в классе transmit.
Объявил объект Mytransmit в диалоговом классе.


Есть также функция:
pcap_loop(Mytransmit.adhandle, 0 ,, NULL);

3 параметр должен быть указатель на dispatcher_handler.

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

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель - C++
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); private: void echo_f (){}; ...

Передать в неуправляемую функцию указатель на указатель - C++
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr) { FUNC((int **)ptr); ...

Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) - C++
Подскажите как передать указатель на файл в функцию, как вернуть указатель на файл из функции. void Open() // из этой функции вернуть...

Как передать параметр типа "указатель на указатель" в функцию? - C++
#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; #include <iomanip> using std::setiosflags; ...

Как передать указатель на функцию в функцию - C++
И как с ней работать?

Передать указатель в функцию - C++
Помогите, пожалуйста, как передать указатель на элемент линейного списка?

15
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 16:22 #2
Проще всего передать указатель на свой класс transmit и уже работать с указателем на класс, дёргая его методы и т.д
0
Abraziv__
-52 / 3 / 0
Регистрация: 05.02.2013
Сообщений: 372
05.04.2014, 16:28  [ТС] #3
Функция не моя, библиотечная. Так что приходится плясать по её правилам.
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 16:41 #4
Ну передай указатель на функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
class SomeClass
{
    public:
    static int one_plus_num(int num){
        return 1 + num;
    }
};
 
int main()
{
    int (*fun_ptr)(int num) = 0;
    fun_ptr = &SomeClass::one_plus_num;
    cout<<fun_ptr(6)<<endl;
    return 0;
}
http://codepad.org/eN2Twzi9

Добавлено через 4 минуты
Вот вариант если функция глобальная
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
#include <iostream>
using namespace std;
 
int g_one_plus_num(int num){
        return 1 + num;
    }
 
class SomeClass
{
    public:
    static int one_plus_num(int num){
        return 1 + num;
    }
};
 
int main()
{
    int (*fun_ptr)(int num) = 0;
    fun_ptr = &SomeClass::one_plus_num;
    cout<<fun_ptr(6)<<endl;
    fun_ptr = g_one_plus_num;
    cout<<fun_ptr(10)<<endl;
    return 0;
}
http://codepad.org/CjNTzFyn
1
Abraziv__
-52 / 3 / 0
Регистрация: 05.02.2013
Сообщений: 372
05.04.2014, 16:58  [ТС] #5
Спасибо. Буду разбираться. Немного странный синтаксис. Почему указатель инициализируется классом а не объектом, видать, компилятор автоматически создает объект, когда через этот указатель обращаются к полям.
Ладно появится время надо читать про С++.
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 17:05 #6
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Немного странный синтаксис.
где именно?
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Почему указатель инициализируется классом а не объектом
- что ты имел ввиду?

Добавлено через 1 минуту
Через указатель на функцию можно либо обратиться к статическому методу класса либо глобальной функции, в остальных случаях прямой доступ к методам класса без использования указателя на класс не возможен

Добавлено через 2 минуты
Если ты имел ввиду это
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
class SomeClass
{
    public:
    int one_plus_num(int num){
        return 1 + num;
    }
};
 
int main()
{
    int (*fun_ptr)(int num) = 0;
    fun_ptr = &SomeClass::one_plus_num;
    cout<<fun_ptr(6)<<endl;
    return 0;
}
то получишь ошибку линковщика http://codepad.org/c2LPMvQq
0
Abraziv__
-52 / 3 / 0
Регистрация: 05.02.2013
Сообщений: 372
05.04.2014, 17:08  [ТС] #7
Я имел введу не ваш код, а синтаксис с++,я начинающий,не судите строга.
Вот здесь идетинициализация указателя классом,а не объектом.
fun_ptr = &SomeClass::one_plus_num;
Вот я и подумал, на данном этапе компилятор вычисляет относительный адрес до функции-члена,
А когда в коде встречается оператор обращения к функции класса, компиль создает, уже объект, тока пользователь этого не видит, и с помощью вычисленного заранее относительного адреса, определяет необходимый адрес в памяти. Это я так, спортивный интерес просто.
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 17:13 #8
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Я имел введу не ваш код, а синтаксис с++,
- мой код был приведен в пример как сделать поинтер на функцию
Цитата Сообщение от Abraziv__ Посмотреть сообщение
А когда в коде встречается оператор обращения к функции класса, компиль создает, уже объект, тока пользователь этого не видит, и с помощью вычисленного заранее относительного адреса, определяет необходимый адрес в памяти. Это я так, спортивный интерес просто.
- статический метод на то и статический, что объект класса для него не обязателен, по сути это голая никак не привязанная к классу функция т.к внутри данного метода нет this класса. Думаю ты хотел дёрнув метод через указатель создать где то целый класс я прав?
0
Abraziv__
-52 / 3 / 0
Регистрация: 05.02.2013
Сообщений: 372
06.04.2014, 13:22  [ТС] #9
Нет Юрий, я просто рассуждал. Спасибо за помощь, завтра буду пробовать. Я больше программировал низкоуровневый код,МК, драйвера и тд. С ООП проблемы огромные, точнее знаний нет.

Добавлено через 10 часов 16 минут
Я делаю следующее:
C++
1
2
void(transmit::*p)(u_char *,const struct pcap_pkthdr *, const u_char *) = &transmit::dispatcher_handler;
pcap_loop(Mytransmit.adhandle, 0 ,p, NULL);
Пишет, что
pcap_loop: невозможно преобразовать параметр 3 из "void (__thiscall transmit::* )(u_char *,const pcap_pkthdr *,const u_char *)" в "pcap_handler"

а pcap_handler это:

typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, const u_char *);

Добавлено через 1 час 29 минут
разобрался.

Добавлено через 8 часов 5 минут
ЮРА, вы не знаете случайно, почему при вызове MyDlg->UpdateData(TRUE); вылетает с ошибкой ?

Добавлено через 13 минут
Видать, потому что из другого потока запустил.
0
Abraziv__
-52 / 3 / 0
Регистрация: 05.02.2013
Сообщений: 372
09.04.2014, 14:48  [ТС] #10
-=ЮрА=-
Я хотел у вас спросить.
За каждым элементом правления в MFC можно закрепить переменную значения или управления. В мастере есть опция, которая помогает отслеживать для переменной значения, превышение или преуменьшение значения. Когда происходит преув. или преумен. значения выскакивает сообщение которое уведомляет пользователя.
У меня, что то случилось с одной переменной и сообщение перестало выскакивать. Как можно исправить ?
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.04.2014, 20:27 #11
Цитата Сообщение от Abraziv__ Посмотреть сообщение
У меня, что то случилось с одной переменной и сообщение перестало выскакивать. Как можно исправить ?
- не возможно если не менялся тип.
Поясню :
Если скажем был тип INT то при вводе с символами отличными от +-0...9 выскакивало бы сообщение об ошибке. А вот если изменить тип на CString то конечно никакой проверки на корректность вводимых данных осуществляться не будет. Покажи ветку кода где не появляется сообщение об ошибке.
0
Abraziv__
-52 / 3 / 0
Регистрация: 05.02.2013
Сообщений: 372
10.04.2014, 04:12  [ТС] #12
А вы не знаете случаем - "Как сделать событие на нажатие отключенной кнопки?".
0
alkagolik
Заблокирован
10.04.2014, 07:00 #13
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Немного странный синтаксис.
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Почему указатель инициализируется классом а не объектом
Это смертельный коктейль императивщины языка Си и ОО концепта. Юзай smalltalk или дэ, лучше аду.
-=ЮрА=-, инициализировать адреса знаковым типом... ну ты понял, брат.
0
Abraziv__
-52 / 3 / 0
Регистрация: 05.02.2013
Сообщений: 372
10.04.2014, 07:40  [ТС] #14
Точно )))))
0
alkagolik
Заблокирован
10.04.2014, 07:49 #15
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Точно
свд была когда-то женой.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2014, 07:49
Привет! Вот еще темы с ответами:

Передать в функцию указатель на вектор - C++
У меня есть вектор. Большой. Можно ли передать его так в ф-цию что бы не создавалась копия и что бы все методы работали (например...

Указатель на функцию (как передать?) - C++
void abc(int a, int b) { } void func(void *f(int, int)) { f; }

Как в функцию передать указатель на матрицу? - C++
Че то я немного туплю, давно с функциями не работал, мне нужно реализовать функцию которая бы работала и изменяла элементы матрицы...

Как передать указатель на структуру в функцию - C++
Подскажите как передать указатель *arr на структуру в функцию2, чтобы в ней использовать уже заполненные массивы: void func1() ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
10.04.2014, 07:49
Ответ Создать тему
Опции темы

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