c ++调用类函数作为回调

时间:2016-02-20 13:37:04

标签: c++

我想调用一个类函数作为我的计时器的回调,但它正在修复。我试着做的另一种方法是将一个函数指针复制到项目中的另一个cpp文件,这样有人告诉我这里有什么问题。

标头包含文件程序:

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来从Program.cpp调用Action。

ProgBr1->Action();

但我不能使另一个变量初始化并使用

获取指针
ProgBr1 = new Processor(hWnd);

那么有没有办法制作另一个指针数据并将ProgBr1值复制到它并在Timecatch.cpp文件中使用它?

真的很困惑,对c ++很新。如果我得到任何更新,将在此处发布。

2 个答案:

答案 0 :(得分:3)

错误消息非常清楚地告诉您错误:

static member functions do not have 'this' pointers`

这意味着对this->Action();的调用是非法的。回调函数必须为static,编译器不会向static函数传递隐藏的this指针。换句话说,static函数不与类的特定实例相关联,而是与该类的所有对象相关。

遗憾的是,无法将任意数据传递给Windows计时器回调函数。 SetTimer没有LPARAM或等效参数。

为了使此代码有效,您必须将指针存储在与计时器关联的窗口中。您可以使用例如SetProp()

来执行此操作

或者,如果您有多个与单个窗口关联的计时器,则不会很好地扩展。在这种情况下,您可以使用静态集合(例如std::map)来跟踪您想要与计时器关联的数据指针。的ID。

编辑:假设您的示例代码实际上就是您正在做的事情,而不仅仅是一个人为的示例,看起来您可以使代码基本上工作"内联"调用Action成员函数。我不确定这会做什么,但它会编译并运行。也许现在可能是一个很好的地方指出,我很不清楚这段代码的目的是什么。您是否只是尝试连续轮询并设置光标位置?这是荒谬的毫无意义。我所要做的就是移动鼠标并重新拧紧。您将不得不经常运行计时器,徒劳地尝试修复鼠标指针位置,这会破坏性能并惹恼每个人。请尝试拔掉鼠标。

答案 1 :(得分:0)

用static标记的函数实际上是静态函数。它可以被称为Progc::ClickCall(...)并且没有这个指针并且没有对象引用。它就像通常的函数,但在类的命名空间中。

需要删除static并将其设为非静态类成员。如果你需要静态函数,那么你需要通过param将this传递给静态函数,或者使用singleton并从singleton中获取类引用。