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

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

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

Студворк — интернет-сервис помощи студентам
Друзья подскажите пожалуйста где ошибка. Я хочу передать указатель на функцию из экземпляра класса 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2019, 23:04
Ответы с готовыми решениями:

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

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

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

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

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2019, 23:30
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru