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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Глупый вопрос по шаблонам http://www.cyberforum.ru/cpp-beginners/thread372855.html
Доброе время суток! Я достаточно опытный программист Java, но жизнь, как говорится, заставила переквалифицироваться на C++, причем, очень срочно. Давным давно был у меня опыт написания на C++ и MFC, но я не вникал тогда глубоко. Собственно вопрос: Пишут, что, в отличие от Java, в C++ создается откомпилированный экземпляр функции или класса для каждого значения параметров шаблона. Очевидно,...
C++ ODBC Столкнулся с такой проблемой при работе с базой данных. Вот таким образом я читаю определенную строку из базы: CString str; str.Format("SELECT field2 FROM table WHERE field1 = %d;",id); CRecordset rec(db); CDBVariant var; rec.Open(CRecordset::forwardOnly,str,CRecordset::readOnly); http://www.cyberforum.ru/cpp-beginners/thread372841.html
C++ Сортировка строк
Помогите написать программу, которая читает строки из файла в массив строк, и выводит их на экран, отсортировав по названию, исключая правовую форму. Т.е. не сравнивает ЗАО , ОАО , ООО Пример: ЗАО Оскол , ОАО Крона , ООО Аристократ Должно получиться: ООО Аристократ , ОАО Крона , ЗАО Оскол Заранее спасибо!
неверный ввод C++
cout<<"\tViberite variant vvoda:\n\n"; cout<<"\t1.Vvod vruchnuy\n"; cout<<"\t2.Iz faila"; int menu=0; cout<<"\n\nVash variant ? (1 or 2): "; cin>>menu; /*while(menu!=1 || menu !=2) Почему данный цикл не работает?(конешно /**/убираю))) { cout<<"Error.Vvedite vash variant: "; cin>>menu;
C++ Подскажите что обозначают выделенные строки. http://www.cyberforum.ru/cpp-beginners/thread372815.html
Что обозначают 10,11 и 12 строки??? Заране спасибо. Я знаю что printf -вывод параметров на дисплей, а \n -управляющая последовательность. Но в итоге что обозначают 10,11 и 12 строки я понять не могу. Листининг программы.#include<iostream.h> #include<stdio.h> #include<math.h> int main() { double x1,x2,dx,a,b,c,f; printf("Enter x1,x2,dx,a,b,c \n"); scanf("%lf %lf %lf %lf %lf...
C++ Програмно создать txt файл.. Народ как создать txt файл програмно на c++.? Заранее благодарен) подробнее

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

Для больщего понимания С++ и 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;
           ...
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 14:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru