Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 22.10.2016
Сообщений: 105
1

Передача указателя на функцию

10.05.2019, 23:04. Показов 631. Ответов 2

Author24 — интернет-сервис помощи студентам
Друзья подскажите пожалуйста где ошибка. Я хочу передать указатель на функцию из экземпляра класса cThreadPool в главный класс. Возникает ошибка "тип возвращаемого значения не соответствует типу функции" Привожу код
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "pch.h"
#include <iostream>
#include "cThreadPool.h"
 
using namespace std;
 
size_t activeMethod;
 
cThreadPool::cThreadPool()
{
    activeMethod = 0;
}
 
void cThreadPool::setActiveMethod(size_t t) {
    activeMethod = t;
}
 
DWORD WINAPI cThreadPool::method_0(LPVOID t) {
    cout << "Method_0\n";
    return 0;
}
 
DWORD WINAPI cThreadPool::method_1(LPVOID t) {
    cout << "Method_1\n";
    return 0;
}
 
DWORD WINAPI cThreadPool::method_2(LPVOID t) {
    cout << "Method_2\n";
    return 0;
}
 
DWORD WINAPI cThreadPool::method_3(LPVOID t) {
    cout << "Method_3\n";
    return 0;
}
 
DWORD WINAPI cThreadPool::method_4(LPVOID t) {
    cout << "Method_4\n";
    return 0;
}
 
 
 
DWORD (__stdcall * DoActiveMethod())(LPVOID) {
    switch (activeMethod)
    {
    case 0: 
        return &cThreadPool::method_0;
        break;
    
    case 1: 
        return &cThreadPool::method_1;
        break;
    
    case 2: 
        return &cThreadPool::method_2;
        break;
    
    case 3: 
        return &cThreadPool::method_3;
        break;
    
    case 4: 
        return &cThreadPool::method_4;
        break;
    
    default:
        return nullptr;
        break;
    }
}
 
size_t cThreadPool::getActiveMethod() {
    return activeMethod;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2019, 23:04
Ответы с готовыми решениями:

Передача указателя на шаблонную функцию в другую функцию
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает...

передача указателя на функцию
Помогите исправить ошибку уже незнаю как быть В бивает ту ошибку error C2664: Generate:...

Передача указателя на функцию
Есть класс в котором: typedef void(*setChar)(int x, int y, wchar_t c); void...

Передача в функцию указателя
Почему плохо передавать в функцию указатель на строку или массив и возвращать указатель на строку...

2
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
10.05.2019, 23:19 2
Цитата Сообщение от Vadim00311 Посмотреть сообщение
указатель на функцию
Указатель на функцию и указатель на метод класса - вещи совершенно разные.

Цитата Сообщение от Vadim00311 Посмотреть сообщение
C++
1
DWORD (__stdcall * DoActiveMethod())(LPVOID)
C++
1
2
3
4
using tMethodPtr = DWORD (WINAPI cThreadPool::*)(LPVOID);
tMethodPtr DoActiveMethod()(LPVOID) {
    // ...
}
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
10.05.2019, 23:30 3
Вызов функции или статического метода класса отличается от вызова функции класса. Размер указателя на метод класса отличается от размера указателя на функцию, его нельзя преобразовать в указатель на функцию или в указатель.

Если нужно передать метод, то как в посте выше, вызывать его например так:

C++
1
2
3
void *vd0, *vd1;
cThreadPool pool1;
(pool1.*pool1.DoActiveMethod(vd0))(vd1);
Либо использовать указатель на указатель на метод (его можно преобразовать в void *). Либо std::bind (https://en.cppreference.com/w/... ional/bind) (а тут привязка к типу будет).
0
10.05.2019, 23:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2019, 23:30
Помогаю со студенческими работами здесь

Передача указателя в функцию
Здраствуйте. Если не охота читать гору текста то этот абзац + последущий за ним код можете...

Передача указателя в функцию
Здравствуйте. Прошу помощи, сижу уже пару часов читаю мануалы, но так и не смог до конца понять,...

Передача указателя в функцию
Поиском не пользовался, возможно данный вопрос уже проскакивал. Проблема том, что VS2010 на отрез...

Передача указателя на функцию
Доброго дня Форумчане. Хотелось бы узнать как вызывать функцию получив на нее указатель? пример...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru