Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
26.10.2011, 13:39     Вызов функции-члена класса через указатель на нее #1
Привет всем!

Для больщего понимания С++ и 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!"));
}
Прошу хорошего совета.
Ошибка :
Код
* Ошибка 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;
           ...
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 13:39     Вызов функции-члена класса через указатель на нее
Посмотрите здесь:

рекурсивный вызов функции-члена C++
вызов функции из массива, через указатель.) C++
C++ Вызов виртуальной функции через указатель на базовый класс
C++ Объявление класса, создание объекта и вызов функции-члена
C++ Вызов метода класса через указатель на ноль
C++ Вызов функции-члена класса по адресу в памяти
Вызов метода производного класса через указатель на базовый класс C++
C++ Вызов функции-члена элементов списка

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 03:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru