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

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

10.05.2019, 23:04. Показов 795. Ответов 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-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru