Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638

callback - функции, как метод класса

03.04.2023, 06:49. Показов 7237. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Хочу задать слудющий вопрос, хотя тема не нова, но я так её вкурить не могу, а именно, как задать в классе (метод класса) фукцию обратного вызова?
Есть функция, например, такая
C++
1
2
3
4
int CALLBACK EnumFontFamExProc(LPENUMLOGFONTEX lpelf,
                               NEWTEXTMETRICEX* lpntm,
                               DWORD FontType,
                               LPARAM lParam);
как сделать её методом класса?
почему если делать так, то выскакивает ошибка:
C++
1
2
3
4
5
6
7
8
class X
{
    public:
        int CALLBACK EnumFontFamExProc(LPENUMLOGFONTEX lpelf,
                               NEWTEXTMETRICEX* lpntm,
                               DWORD FontType,
                               LPARAM lParam);
};
Я так понял, это может привести к каким-то неприятным последствиям..., к каким?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2023, 06:49
Ответы с готовыми решениями:

Метод класса не работает как callback-функция
Всем привет! Помогите разобраться с синтаксисом. Есть gui-прога, в которой содержится функция TForm4::kau2_2_callback(float value) ...

Методы класса как callback функции
Всем привет. Пытаюсь разобраться как передавать методы класса в качестве callback. Я конечно понимаю, что есть решения вроде Boost или...

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

60
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.04.2023, 05:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Liss29 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
switch(msg)
 {
 case WM_CREATE:
 {
 ((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
 return 0;
 }
 //.....
}
Через lParam при обработке WM_CREATE процедура окна получает CREATESTRUCT*.
https://learn.microsoft.com/en... /wm-create
https://learn.microsoft.com/en... atestructw
Откуда там kwindow* ?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 05:51
Цитата Сообщение от Liss29 Посмотреть сообщение
Т.е. если я хочу оформить класс, скажем, класс, который создаёт окна, и хотел бы чтобы функция этого окна так же была в классе я этого сделать не смогу иначе как
Технически - да, все так.
Только организовать все несколько иначе имеет смысл на мой взгляд.

1) Цикл обработки сообщений вынести из класса kwindow.
Либо просто в _tWinMain(), либо "по модному" - сделать отдельный класс TApplication и в него это все вынести (хотя это перебор на мой взгляд).
В самом деле: окон ведь может быть несколько, из какого Go() вызывать в вашем случае? "из любого" - конечно ответ, но все же нелогично, согласитесь, этот цикл - явно не к окну по смыслу относится.

2) switch с выбором сообщений явно надо перенести в метод WndProc(). А функция должна просто вызывать метод - и все.

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
class kwindow
{
    public:
        kwindow() { }
 
        LRESULT WndProc(HWND, UINT, WPARAM, LPARAM)
        {
            switch(msg)
            {
                case WM_CREATE:
                {
                    //.......
                    return 0;
                }
                // case с другими обрабатываемыми сообщениями
             }
            return ::DefWindowProc(hwnd, msg, wParam, lParam);
        }
 
        void Create()
        {
            // .. здесь регистрация класса окна и создание окна
            WNDCLASSA WndClass;
            // заполнение WndClass....
            ....
            WndClass.lpfnWndProc = WndProcProxy;
            RegisterClass(&WndClass);  // добавить проверку результата, конечно
 
            hwnd = ::CreateWindow(..., (LPARAM)this);
        }
 
        void ShowWindow(int  nCmdShow)
        {
            ::ShowWindow(hwnd, nCmdShow);
        }
 
    private:
        HWND hwnd;
 
    private:
        static LRESULT CALLBACK WndProcProxy(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            return ((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
        }
};
 
int WINAPI _tWinMain()
{
    kwindow win1(//......);
    win1.Create();
    win1.ShowWindow(SW_SHOW);  // или ShowModal сделать
 
    MSG msg = {};
    while(GetMessage(&msg, NULL, 0 , 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
     return msg.wParam;
}
Добавлено через 1 минуту
Есть же MFC, например, можно посмотреть как там сделано API идеологически. Это как раз по сути простейшая обертка над WinApi
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.04.2023, 05:51
Цитата Сообщение от Liss29 Посмотреть сообщение
А альтернатива лямбде?
Лямбде без захвата?
Статическая функция класса или "обычная" функция вне класса.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 05:55
Цитата Сообщение от politoto Посмотреть сообщение
Через lParam при обработке WM_CREATE процедура окна получает CREATESTRUCT*.
Хорошее замечание!

Тогда в моем примере надо, конечно, в WndProcProxy отдельно обработать WM_CREATE и в этом случае метод класса не вызывать. В общем-то нет никакого особого смысла в обработке этого сообщения.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
05.04.2023, 06:32  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
В самом деле: окон ведь может быть несколько, из какого Go() вызывать в вашем случае?
Что имеется ввиду, создать несколько объектов, например так, kwindow win1, win2; и для каждого вызывать Go, win1.Go(), win2.Go() или что имеется ввиду? Хотя построение конкретного класса в данном случае не так важна, тут бы разобраться с callback-оми внутри класса. Попутно можно, конечно, развить эту тему, тему создания некоего класса, допустим, окна, думаю это классический пример.

Цитата Сообщение от KSergey9 Посмотреть сообщение
этот цикл - явно не к окну по смыслу относится.
Ну, может быть и так.

Цитата Сообщение от politoto Посмотреть сообщение
Статическая функция класса или "обычная" функция вне класса.
Есть ещё вариант с подменой байтов, но не могу его найти, где-то в сети видел подобный вариант и, вроде бы, он как раз относился к встраиванию callback-функции в класс...
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 06:49
Цитата Сообщение от Liss29 Посмотреть сообщение
создать несколько объектов, например так, kwindow win1, win2;
Да, у вас же не одно окно в приложении будет.

Цитата Сообщение от Liss29 Посмотреть сообщение
и для каждого вызывать Go, win1.Go(), win2.Go() или что имеется ввиду?
Это точно не имеется ввиду, т.к. цикл обработки сообщений вприложении - только один; более того, из цикла обработки сообщений вы выходите при завершении приложения.
Так что (в случае вашей реализации Go() ) вызвать
win1.Go();
win2.Go();
не выйдет, т.к. в первом же Go() вы "застрянете" на всё время работы приложения.

Добавлено через 5 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
Есть ещё вариант с подменой байтов,
Вот этот вариант и есть "с подменой байтов" на самом деле:
C++
1
((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
Вы просто этого не осознаёте.

Да, можно разобраться как вызываются функции в машинном коде, как в них передаются параметры, как передаются параметры методов классов и т.д., на основании этих знаний навернуть ассемблерный код по "подмахиванию" байтиков в нужные места. Это всё увлекательно и быть может даже полезно в учебных целях и в целях профессиональной пальцерастопыки, но никакого практического смысла и никаких выигрышей в сравнении с вариантом выше не даёт абсолютно. Всё равно где-то у вас обязательно будет объявлена "просто функция" в любом её обличии, которая в итоге будет вызывать метод класса, указатель на который будет передаваться через lparam. Ибо иначе - никак.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.04.2023, 08:03
Цитата Сообщение от KSergey9 Посмотреть сообщение
можно разобраться как вызываются функции в машинном коде, как в них передаются параметры, как передаются параметры методов классов и т.д., на основании этих знаний навернуть
Вот, например:
https://github.com/Chuyu-Team/... unk.h#L225
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
struct _stdcallthunk {
    ULONG   m_ldr_r16;      // ldr  x16, [pc, #24]
    ULONG   m_ldr_r0;       // ldr  x0, [pc, #12]
    ULONG   m_br;           // br   x16      
    ULONG   m_pad;  
    ULONG64 m_pThis;
    ULONG64 m_pFunc;
    BOOL Init(DWORD_PTR proc, void* pThis) {
        m_ldr_r16 = 0x580000D0;
        m_ldr_r0 = 0x58000060;
        m_br = 0xd61f0200;
        m_pThis = (ULONG64)pThis;
        m_pFunc = (ULONG64)proc;
        // write block from data cache and          
        //  flush from instruction cache        
        FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));  
        return TRUE;
    }
    void* GetCodeAddress() {
        return this;
    }
    void* operator new(size_t)
    {
        return __AllocStdCallThunk();
    }
    void operator delete(void* pThunk) {
        __FreeStdCallThunk(pThunk);
    }
};
Навернули без ассемблеров.
0
05.04.2023, 08:48

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
m_ldr_r16 = 0x580000D0;
m_ldr_r0 = 0x58000060;
m_br = 0xd61f0200;
Если это не ассемблер - то я римский папа как минимум.

0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.04.2023, 09:28
Это присваивание значений ( в нашем случае - кодов инструкций ) членам _stdcallthunk средствами c++.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 09:37
politoto,
если вы видите разницу между ассемблерными вставками и прописыванием этого же в маш. кодах - ну я вас поздравляю, конечно.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
05.04.2023, 09:59
politoto,
Не факт что сработает. Исполнение кода на стеке/в куче может быть запрещено
0
05.04.2023, 10:22

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
если вы видите разницу между ассемблерными вставками и прописыванием этого же в маш. кодах
В MSVC x64 асмовские вставки вообще не предусмотрены, что не мешает генерировать инструкции стандартными средствами c++.

0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
05.04.2023, 11:50
Цитата Сообщение от Azathtot Посмотреть сообщение
Исполнение кода на стеке/в куче может быть запрещено
Насколько тут можно увидеть, за гарантии возможности исполнения здесь отвечает __AllocStdCallThunk. А там внутри наверняка вызов VirtualAlloc с чем-то вроде PAGE_EXECUTE_READWRITE.

Добавлено через 16 минут
Цитата Сообщение от KSergey9 Посмотреть сообщение
если я верно понял общую смысловую идею
Идея поста №14 до безумия проста: давайте сохраним callable (со всей типизацией) в статическом объекте, а затем будем через этот статический объект делать контекстный вызов метода.
В простейшем случае можно так же просто this сохранить где-то в глобальной области и им пользоваться при вызове. Принципиальная суть от этого не изменится, только форма.

Недостатки подходов, использующих глобальное состояние, думаю, никому не нужно здесь объяснять, хотя нужно сказать, что в определенных ситуациях это будет хорошо работать. Но я бы добавил что неизменность этой ситуации хорошо бы как-то гарантировать (но это не всегда возможно).
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
05.04.2023, 21:47  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
у вас же не одно окно в приложении будет.
Исходить нужно из этого.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Это точно не имеется ввиду, т.к. цикл обработки сообщений вприложении - только один;
Это факт почему-то, не знаю почему, я всегда упускаю из виду, не могу я принять тот факт, что n-ое количество окон обрабатывает один цикл обработки сообщений.( И в параллельных программах это так же?!
Цитата Сообщение от KSergey9 Посмотреть сообщение
Так что (в случае вашей реализации Go() ) вызвать
А в случае твой реализации это не так) Ну, хорошо, я с этим соглачен, но, что если нужно оформить класс так, чисто теоретически, как будет происходить выборка сообщений для окон... при регистрации класса окна(может быть регистрацию тоже нужно оформить, как отдельный класс) мы указываем для каждого окна его функцию, так? так. Происходит выборка сообщений (GetMessage берёт сообщение из очереди) и исходя из того какое окно активно и на каком окне произошло событие отправляет(DispatchMessage ориентируется по HWND окна, если я не ошибаюсь) его тому окну. Так что, по идее, должно работать правильно.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Да, можно разобраться как вызываются функции в машинном коде, как в них передаются параметры, как передаются параметры методов классов и т.д.,
Ради этого всё и затевается, что бы разобраться, ибо, если знаешь как работает, не теоретически, а действительно понимаешь, тогда многие вопросы сами собой отпадают, разве не так?)

Цитата Сообщение от KSergey9 Посмотреть сообщение
Всё равно где-то у вас обязательно будет объявлена "просто функция" в любом её обличии, которая в итоге будет вызывать метод класса, указатель на который будет передаваться через lparam.
Как ни крути, всё равно результат один....

C++
1
2
3
4
5
6
7
8
9
10
11
[quote="politoto;16843680"]BOOL Init(DWORD_PTR proc, void* pThis) {
        m_ldr_r16 = 0x580000D0;  //Что это за значения? адреса чего?
        m_ldr_r0 = 0x58000060;
        m_br = 0xd61f0200;
        m_pThis = (ULONG64)pThis;
        m_pFunc = (ULONG64)proc;
        // write block from data cache and          
        //  flush from instruction cache        
        FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));  
        return TRUE;
    }[/quote]
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 21:59
Цитата Сообщение от Liss29 Посмотреть сообщение
один цикл обработки сообщений.( И в параллельных программах это так же?!
А что такое "параллельные программы"?

Добавлено через 2 минуты
Цитата Сообщение от Liss29 Посмотреть сообщение
может быть регистрацию тоже нужно оформить, как отдельный класс
Смысла нет.

Добавлено через 55 секунд
Цитата Сообщение от Liss29 Посмотреть сообщение
мы указываем для каждого окна его функцию, так? так
Нет, не так. Функция указывается для класса окон, а не конкретного окна. См. мой пример кода и описание соотв. функций.
Можно создать сколько угодно окон одного класса. Например, окна класса Button для кнопок.

Добавлено через 1 минуту
Цитата Сообщение от Liss29 Посмотреть сообщение
и исходя из того какое окно активно и на каком окне произошло событие отправляет(DispatchMessage ориентируется по HWND окна, если я не ошибаюсь) его тому окну.
Windows сама отлично знает кому какое сообщение отправить. И какую именно функцию для обработки сообщения вызвать в зависимости от класса окна.
Тем более, что неактивные окна тоже должны получать свои сообщения (например, WM_PAINT), если систем их отправила.

DispatchMessage() внутри себя умеет понимать какую оконную функцию дернуть, т.е. к какому классу относится окно для данного сообщения (по hwnd).
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
05.04.2023, 22:33  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
А что такое "параллельные программы"?
Параллельное программирование.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Нет, не так. Функция указывается для класса окон
Я это и имел ввиду, формулировка, не та, но я имел ввиду именно регистрацию класса окна.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Windows сама отлично знает кому какое сообщение отправить.
Откуда она это знает... я знаю, что windows это знает, не телепатически же она об этом узнаёт.)

Цитата Сообщение от KSergey9 Посмотреть сообщение
т.е. к какому классу относится окно для данного сообщения (по hwnd).
Ну хоть какая-то конкретика.

Если действовать так как предлагал ты, то мы лишаемся такого средства С++, как полиморфизм, правильно?
C++
1
2
3
4
5
private:
        static LRESULT CALLBACK WndProcProxy(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            return ((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
        }
Но ведь может потребоваться или даже практически наверняка потребуется наследование, что делать...
И ещё, если объявлять функцию так, как она объявлена выше, то разве нельзя её использовать для обработки сообщений, она объявлена как static то есть this не помеха, тогда зачем этот финт нужен?
C++
1
((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 22:57
Цитата Сообщение от Liss29 Посмотреть сообщение
Параллельное программирование.
Это слишком общий и неконкретный термин, чтобы можно было что-то предметно обсуждать.
Многопоточное приложение что-ли?

Цитата Сообщение от Liss29 Посмотреть сообщение
Откуда она это знает... я знаю, что windows это знает, не телепатически же она об этом узнаёт.)
Да вроде очевидно же: в сообщении есть hwnd, уникальный идентификатор окна; по нему можно получить информацию о классе окна, а значит и об адресе оконной процедуры, есть даже соотв. функции API. Впрочем, hwnd - это явно напрямую адрес внутренней структуры Windows, где вся эта информация уже есть, чтобы быстро, значить.

Цитата Сообщение от Liss29 Посмотреть сообщение
то мы лишаемся такого средства С++, как полиморфизм, правильно?
Виртуальные функции пока не запрещены ведь, так? Хочется наследоваться - делаем как в любом уважающем себя фреймворке, т.е. объявляем ее виртуальной. Но замечание хорошее, да.

Цитата Сообщение от Liss29 Посмотреть сообщение
И ещё, если объявлять функцию так, как она объявлена выше, то разве нельзя её использовать для обработки сообщений, она объявлена как static то есть this не помеха, тогда зачем этот финт нужен?
Вот это вообще не понял.
Разумеется, всю обработку сообщений можно сложить в WndProcProxy (она подразумевалась под "выше", да?).
Но ведь вся ветка с того и началась: как функцию обработки сообщений - т.е. WndProc - сделать методом класса. И в ветке было показано как.
И вдруг такой неожиданный вопрос.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
05.04.2023, 23:30  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Многопоточное приложение что-ли?
Не знаю, книг скачал, там речь идёт о параллельном программировании "Параллельное программирование на C++", что-то в этом духе, где тут многопоточность упоминается? Так что всё же параллельное, а не многопоточное в многопоточном приложении цикл обработки сообщений один, это я знаю, но забываю)

Цитата Сообщение от KSergey9 Посмотреть сообщение
в сообщении есть hwnd, уникальный идентификатор окна;
Да, есть, значит windows реагируя на запрос GetMessage основывается на этом факте при выборе сообщений, выбирает сообщения только с нужными hwnd....

Цитата Сообщение от KSergey9 Посмотреть сообщение
Виртуальные функции пока не запрещены ведь, так?
Но при объявлении static переменных или функций this для этого класса перестаёт существовать, а полиморфизм требует наличия этого указателя, разве не так?!

Цитата Сообщение от KSergey9 Посмотреть сообщение
Разумеется, всю обработку сообщений можно сложить в WndProcProxy (она подразумевалась под "выше", да?).
Но ведь вся ветка с того и началась: как функцию обработки сообщений - т.е. WndProc - сделать методом класса. И в ветке было показано как.
Разве WndProcProxy не равно функция окна, она не внутри класса располагается...

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
И вдруг такой неожиданный вопрос.
Сам удивляюсь.

0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
06.04.2023, 06:04
Цитата Сообщение от Liss29 Посмотреть сообщение
Не знаю, книг скачал, там речь идёт о параллельном программировании
Хорошо, как будут более внятные условия - будет смысл обсудить.

Цитата Сообщение от Liss29 Посмотреть сообщение
в многопоточном приложении цикл обработки сообщений один, это я знаю, но забываю)
В многопоточном приложении в каждом потоке, где создаются окна, должен быть свой цикл обработки сообщений. Впрочем, сообщения не обязательно связаны с окнами, но это отдельная история.

Цитата Сообщение от Liss29 Посмотреть сообщение
Разве WndProcProxy не равно функция окна,
Да, именно функция окна.

Цитата Сообщение от Liss29 Посмотреть сообщение
она не внутри класса располагается...
Не обязательно.

Цитата Сообщение от Liss29 Посмотреть сообщение
Но при объявлении static переменных или функций this для этого класса перестаёт существовать, а полиморфизм требует наличия этого указателя, разве не так?!
Давайте вы заново полностью сформулируете вопрос. Я перестал что-либо понимать по этим обрывкам.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
06.04.2023, 10:46
Цитата Сообщение от KSergey9 Посмотреть сообщение
Я перестал что-либо понимать по этим обрывкам.

Не по теме:

Не вы один.. походу ТС не знает что ему нужно. Ему предложили 100500 способов вызова метода класса как функции, но все ему не то...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2023, 10:46

Нестатическая ссылка в статичной (BOOL CALLBACK EnumWindowsProc) функции внутри класса
Здравствуйте форумчане приступлю сразу к сути. В чем сущность алгоритма: Нужно собрать RECT всех отображаемых окон и записать в...

Callback как член класса
В общем, захотел я немного поработать с библиотекой libgit2. Эта библиотека предоставляет API Git'a. Т.е. можно написать свое приложение...

CALLBACK функция как член класса
struct DEVICEINFO { int nDDInfo; }; class CMy { public: void Init(); BOOL CALLBACK DXEnumDirectDraw(GUID FAR*...

Как передать функции через метод класса
Добрый вечер всем! Столкнулся с проблемкой К примеру у меня есть 3 функции.Я хочу в 4 функцию дать массив названий этих 3...

Как в аргумент функции передать указатель на метод класса?
Как в аргумент функции передать указатель на метод класса? Метод в классе у меня статический,все равно не получается(невозможно...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru