Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Указатель на функцию в классе

6.1K
14 ноября 2007 года
Gfunk
42 / / 31.01.2006
class WndFrame{
public:
CreateWin();
private:
WNDCLASSEX wcl;
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
};

WndFrame::CreateWind()
{
wcl.lpfnWndProc=?
}

Не понятно как задать указатель на функцию,которая определена в классе?Функции как токовой нет еще,обьект еще не создан ведь.
13K
15 ноября 2007 года
specter
113 / / 28.09.2007
Цитата: Gfunk
Функции как токовой нет еще,обьект еще не создан ведь.


А как ты вызовешь не статик функцию без создания объекта?

6.1K
15 ноября 2007 года
Gfunk
42 / / 31.01.2006
Ну я ее не вызываю до создания обьекта,я хочу чтоб когда я создам обьект
у структуры wcl обьекта в поле lpfnWndProc был указатель на процедуру окна,которая тоже принадлежит этому обьекту.
13K
15 ноября 2007 года
specter
113 / / 28.09.2007
я говорил про вызов функции WndFrame::CreateWind()... пока не будет создан объект класса WndFrame ты не сможешь вызвать CreateWind()
А вообще я конечно таким заморочками не пользуюсь, но должно работать так:
wcl.lpfnWndProc = &WndFrame::WindowProc;
350
15 ноября 2007 года
cheburator
589 / / 01.06.2006
Цитата: Gfunk
Ну я ее не вызываю до создания обьекта,я хочу чтоб когда я создам обьект
у структуры wcl обьекта в поле lpfnWndProc был указатель на процедуру окна,которая тоже принадлежит этому обьекту.


1. "Процедуру окна, которая тоже принадлежит этому объекту" ты ни описать, ни указать ее адрес в lpfnWndProc не сможешь. Одна и та же процедура окна вызывается для всех окон этого класса.
2. Функцию надо объявить статиком.

Короче, вот отрывок из моего проекта, адаптированный под твой код.

Код:
class WndFrame{
public:
CreateWin();
private:
static LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
LRESULT WindowProcInternal (HWND, UINT, WPARAM, LPARAM);
};

WndFrame::CreateWind()
{
WNDCLASSEX wcl;
wcl.lpfnWndProc = &WindowProc;
}

LRESULT CALLBACK WndFrame::WindowProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
    WndFrame *this_ptr;
    if (msg == WM_INITDIALOG)
    {
        // lp содержит указатель this. Сохраним в WindowLong
        this_ptr = (WndFrame*)lp;
        SetLastError(0);
        ::SetWindowLong (hwnd, DWL_USER, (LONG)lp);
        if (::GetLastError() != 0)
            throw_system_error();
        return this_ptr->WindowProcInternal (hwnd, msg, wp, lp);
    }
    else
    {
        this_ptr = (WndFrame*)::GetWindowLong (hwnd, DWL_USER);
        if (this_ptr == NULL)
            throw exception ("Unknown error");
        return this_ptr->WindowProcInternal (hwnd, msg, wp, lp);
    }
}

LRESULT WndFrame::WindowProcInternal (HWND, UINT, WPARAM, LPARAM)
{
// Это уже нестатическая функция, так что имеется this, можно обращаться к данным объекта
}
3
15 ноября 2007 года
Green
4.8K / / 20.01.2000
Цитата: cheburator
1. "Процедуру окна, которая тоже принадлежит этому объекту" ты ни описать, ни указать ее адрес в lpfnWndProc не сможешь. Одна и та же процедура окна вызывается для всех окон этого класса.


Ну это не совсем так. Смотрим, как устроена эта функциональность в WTL.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог