Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для FireNovel
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297

Вызов функции-члена класса через указатель на нее

26.10.2011, 13:39. Показов 1153. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!

Для больщего понимания С++ и Win Api решил написать небольшой свой FrameWork на подобии .Net-кого
И столкнулся с проблемой (ошибка ниже) не могу сделать вызов функции-члена класса через указатель на нее (Form.h строки 48-51 см. в конце поста)

Причем если записать определение указателя на функцию как:
C++
1
typedef void (*m_MouseEventFunc) (Window *, _MouseEventArgs * );
То в приципе все работает, но по-моему это не очень правильно привязывать к объектам класса глобальную функцию
C++
1
2
3
4
void Form1_OnClick (Window * wnd, _MouseEventArgs * args )
{   
    MsgBox(TEXT("On Click!"));
}
Прошу хорошего совета.
Ошибка :
Code
1
2
3
4
5
* Ошибка 1    error C2664: 
* m_MouseEventHandler::m_MouseEventHandler(Window *,m_MouseEventFunc):
* невозможно преобразовать параметр 2 
* из 'void (__thiscall Form1::* )(Window *,_MouseEventArgs *)'
* в 'm_MouseEventFunc'
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "Form.h"
 
// Класс Form самописаный (не из .Net FrameWork'a)
 
class Form1 : public Form
{
    void InitComponents()   {
        this->pos = _Point(500, 50);
        this->size = _Size(600, 200);
        this->text = TEXT("Форма 2");
        this->Click = new m_MouseEventHandler( this, &Form1::Form1_OnClick );
    }
public:
    Form1(HINSTANCE hInst) : Form( hInst) {
        InitComponents();
    }
 
private:
    void Form1_OnClick (Window * wnd, _MouseEventArgs * args ){ 
        MsgBox(TEXT("On Click!"));
    }   
};

Form.h
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
77
78
79
80
81
82
83
84
85
86
87
88
// Базовый класс для различных параметров функции 
class _EventArgs {  
public:
    _EventArgs() {}
 
    ~_EventArgs() {}
};
 
class _MouseEventArgs : public _EventArgs {
    _Point CursorPos;
    //Fixme  добавить второй параметр положение клавиш Контролб Шифт.....
public :
    _MouseEventArgs (_Point pt) {
        CursorPos = pt;
    }
 
    ~_MouseEventArgs()  {
        CursorPos.x = 0;
        CursorPos.y = 0;
    }
};
 
class Form;
 
typedef void (*m_EventFunc) (Window *, _EventArgs * );
typedef void (Form::* m_MouseEventFunc) (Window *, _MouseEventArgs * );
 
 
template <typename Type = m_EventFunc>
class m_IEventHandler {
 
protected:
    Window * ptrWnd;
    Type  Arg;
public:
 
    m_IEventHandler(Window * obj, Type _arg ) {
        ptrWnd = obj;
        Arg = _arg;
    }   
 
    m_IEventHandler &operator = (m_IEventHandler * handler) {
        ptrWnd  = handler->ptrWnd;
        Arg     = handler->Arg;
    }
 
    template <typename T >
    void Execute( T * _Arg = 0 ) const {
        if (Arg) {
            (*Arg)(ptrWnd, _Arg);
        }       
    }   
    ~m_IEventHandler()  {
        ptrWnd = 0;
        Arg = 0;
    }
};
 
 
 
class m_EventHandler : public m_IEventHandler<m_EventFunc> {
 
public:
    m_EventHandler(Window * obj, m_EventFunc _arg ) : m_IEventHandler<m_EventFunc>( obj, _arg ) {       
    }       
    void Execute( _EventArgs * _Arg = 0 ) const {
        m_IEventHandler::Execute<_EventArgs>(_Arg);     
    }   
};
 
 
class m_MouseEventHandler : public m_IEventHandler<m_MouseEventFunc> {
 
public:
    m_MouseEventHandler(Window * obj, m_MouseEventFunc _arg ) : m_IEventHandler<m_MouseEventFunc>( obj, _arg ) {        
    }   
 
    void Execute( _MouseEventArgs * _Arg = 0 ) const {
        m_IEventHandler::Execute<_MouseEventArgs>(_Arg);        
    }   
};
 
class Form {
    ...
    // Form Events
    m_MouseEventHandler * Click;
           ...
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2011, 13:39
Ответы с готовыми решениями:

Вызов функции-члена класса по адресу в памяти
Всем хорошего дня :) Допустим, что где-то есть static функция, не принимающая аргументов и ничего не возвращающая. Имея один лишь...

Объявление класса, создание объекта и вызов функции-члена
Всем добрый день! Вот так я объявляю класс. typedef map&lt;string, double&gt; datablock; typedef map&lt;string, string&gt; groupvars;...

Вызов метода класса через указатель на ноль
Почему в таком коде не происходит ошибка при вызове метода класса, а уже только в самом методе: struct A { int a; void...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2011, 13:39
Помогаю со студенческими работами здесь

Передача функции-члена в качестве аргумента (не через указатель)
Привет! Озадачился такой проблемой - вот пример того, что нужно typedef void(class1::*method)(); void func (method) {}; func...

Вызов функции-члена через std::function
Суть в следующем Задача сделать обертку вызывающую функцию член класса с параметрами. Для этого используется класс: ...

Вызов метода производного класса через указатель на базовый класс
Всем привет ! Подскажите почему , при выполнении строки 45 я получаю ошибку ? А именно при выполнении выражения c-&gt;fnz() ...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель)
#include &lt;iostream&gt; using namespace std; template &lt;class T1&gt; class mas { public: T1 n; T1 a; void input() ...

Вызов функции из массива, через указатель
имею код #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;utility&gt; using namespace std; void Func() { cout&lt;&lt;&quot;pFunc()&quot;; } ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru