gpt4 book ai didi

c++ - 指向成员函数的奇怪方式

转载 作者:太空狗 更新时间:2023-10-29 21:06:26 24 4
gpt4 key购买 nike

我有一个类 Mouse,用于处理鼠标事件。它由许多静态函数组成,用于简单的“它在哪里等”调用,但它也有一些非静态成员,即当它用作对象时的一些事件处理内容。我遇到了麻烦,但是如何允许任何 对象订阅事件。在我的 Mouse.h 文件中,我有以下声明:(请原谅语法错误,这是来自内存)

typedef void (*MouseEvent)(Point pos,MouseButton button)

class Mouse {
MouseEvent m_downEvent;
//...
void HookMouseDown(MouseEvent handler);
void OnMouseDown();
}

...并在实现中...

void Mouse::HookMouseDown(MouseEvent handler) {
if (handler != NULL) m_downEvent = handler;
}
void Mouse::OnMouseDown() {
if (m_downEvent != NULL) m_downEvent(m_pos,m_button);
}

现在在我订阅者的代码中,以这种方式连接事件似乎是合乎逻辑的:

m_mouse.HookMouseDown(&MyClass::MouseDown);

但是我的编译器 (MVC2008) 不喜欢我向它传递一个成员函数指针而不是自由函数指针这一事实。在这里进行一些研究后,我发现将 typedef 更改为

typedef void (MyClass::*MouseEvent)(Point pos,MouseButton button)

它不会提示并且会正常工作,但问题是这会将事件的订阅者限制为 MyClass 对象。我是否必须让模板参与以允许任何对象订阅这些事件?或者允许任何东西首先使用鼠标事件是不是糟糕的设计?

最佳答案

it won't complain and will work fine, but the problem is that this restricts subscribers to the event to only MyClass objects.

不,您也可以通过派生类实例“调用”该成员。

无论如何,这个问题已经通过使用 std::mem_fun_ptr (c++03) std::function<> (c++0x), std::bind (c++0x) 和 boost 解决了很多次: :绑定(bind)。

这是一个完整的示例,https://ideone.com/mut9V 上观看它:

#include <iostream>

struct MyBase
{
virtual void DoStuff(int, float) { std::cout << "Base" << std::endl; }
};

struct MyDerived : MyBase
{
virtual void DoStuff(int, float) { std::cout << "Derived" << std::endl; }
};

int main()
{
typedef void (MyBase::*memfun)(int, float);

memfun event(&MyBase::DoStuff);

MyBase base;
MyDerived derived;

(base.*event)(42, 3.14);
(derived.*event)(42, 3.14);
}

关于c++ - 指向成员函数的奇怪方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com