2016-02-20 2 views
-2

Я хочу вызвать функцию класса как обратный вызов для моего таймера, но это исправление. Следующий путь, который я пытаюсь сделать, - скопировать указатель на другой файл cpp внутри проекта, чтобы кто-то сказал мне, что в этом плохого.Функция класса вызова C++ как обратный вызов

Заголовок Включить программу File:

class Progc: 

public IStorage 
{ 

public: 
Processor(HWND Hwnd); 
static void CALLBACK ClickCall(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime); 

}; 

Timecatch.cpp файл программы

void CALLBACK Progc::ClickCall(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime) 
{ 
    RECT rcOwner; 
    GetWindowRect(hwnd, &rcOwner); 
    SetCursorPos((rcOwner.top), (rcOwner.left)); 


    this->Action(); 
    KillTimer(hwnd, 0); 
} 

Я получаю ошибку выше

error C2671: 'Progc::ClickCall' : static member functions do not have 'this' pointers 
error C2227: left of '->Action' must point to class/struct/union/generic type 

Продолжение Timecatch.cpp файл программы

void Progc::Action() 
{ 
    SetTimer(hWndParent, 0, 6000,(TIMERPROC) &this->ClickCall); 
} 

Следующая другое имя файла файл программы Program.cpp

Progc *ProgBr1; 
ProgBr1 = new Processor(hWnd); 

Что я хочу сделать, это просто, я хочу, чтобы сделать вызов функции Action() из ClickCall(....) функции после вызова таймера, что функции, либо другим способом, или с помощью указателя ProgBr1, как я использую ProgBr1 для вызова Action из Program.cpp.

ProgBr1->Action(); 

Но я не могу инициализировать другую переменную и получить указатель с

ProgBr1 = new Processor(hWnd); 

Так есть ли способ, чтобы сделать еще данные указателя и скопировать значение ProgBr1 к нему и использовать его в Timecatch.cpp файл?

Действительно смущен и новый для C++. Будет опубликован здесь, если я получу обновление.

ответ

0

Функция, помеченная статикой, является действительно статической функцией. Его можно назвать Progc::ClickCall(...) и не имеют этого указателя и не имеют ссылки на объект. Это похоже на обычные функции, но в пространстве имен класса.

Необходимо удалить static и сделать его нестационарным членом класса. Если вам нужна статическая функция, вам нужно передать this в статическую функцию по параметру или использовать singleton и получить ссылку на класс из singleton.

+0

Есть ли какой-либо другой способ, я могу использовать этот указатель? – user3694193

3

Сообщение об ошибке говорит вам достаточно ясно, что это не так:

static member functions do not have 'this' pointers` 

Это означает, что вызов this->Action(); является незаконным. Функции обратного вызова должны быть static, а функции static не передаются компилятором скрытым указателем this. Другими словами, функции static не связаны с конкретным экземпляром класса, а скорее являются общими для всех объектов класса.

К сожалению, не удается передать произвольные данные в функцию обратного вызова таймера Windows. SetTimer не имеет LPARAM или эквивалентного параметра.

Для того, чтобы этот код работал, вы должны сохранить указатель с окном, связанным с таймером. Вы можете сделать это, используя, например, SetProp().

В качестве альтернативы, если у вас есть несколько таймеров, связанных с одним окном, это не будет хорошо масштабироваться. В этом случае вы можете использовать статический набор (например, std::map), чтобы отслеживать указатели данных, которые вы хотите связать с идентификаторами ваших таймеров.

Edit: Если предположить, что ваш пример кода действительно все, что вы делаете, и не просто надуманный пример, кажется, что вы могли бы сделать код работы, по существу, «встраивание» вызов функции Action члена. Я не уверен, что это будет хорошо, но он будет компилироваться и запускаться. Возможно, сейчас было бы хорошим местом, чтобы указать, что для меня совершенно непонятно, какова цель этого кода. Вы просто пытаетесь провести опрос непрерывно и установить позицию курсора? Это смешно бессмысленно. Все, что мне нужно сделать, это переместить мышь, и вы ввернуты. Вам нужно было бы постоянно запустить таймер в тщетной попытке исправить положение указателя мыши, что разрушило бы производительность и раздражало всех. Вместо этого попробуйте отключить мышь.

+0

Как мы устанавливаем SetProp и получаем его для указателя функции или как мы используем std :: map для сортировки указателя. можете ли вы дать небольшой пример? – user3694193

+0

Ну, это всего лишь часть кода с множеством прав для публикации здесь. Можете ли вы, пожалуйста, привести пример с вложением для данного кода выше, пожалуйста? если вы не возражаете. – user3694193

+0

Я не могу понять, что ваш код должен делать, когда все, что вы разместили, это биты и фрагменты. Что такое класс Progc? Что оно делает? Какова цель таймера? Я могу показать вам пример вызова 'SetProp()', но это действительно очень тривиально, если у вас есть дескриптор окна. Проблема будет заключаться в том, чтобы знать, где положить это в свой код. И я понятия не имею, потому что я не знаю, что делает ваш код или как он выглядит. –

Смежные вопросы