类成员作为 C++ 中 C 样式事件的事件处理程序
Class member as an event handler for a C-style event in C++
我正在使用Android NDK。他们的主要方法如下:
void android_main(struct android_app *app)
{
// onAppCmd is the event:
app->onAppCmd = engine_handle_cmd;
}
engine_handle_cmd
的定义是:
static void engine_handle_cmd(struct android_app *app, int32_t cmd)
{
// Event handling code here...
}
我想创建一个单例事件管理器类,并使用它来处理onAppCmd
事件,而不是使用上述静态方法,如下所示:
事件管理器的声明:
#pragma once
class EventManager
{
public:
static EventManager &getInstance();
void handleCommand(struct android_app *app, int32_t cmd);
~EventManager();
private:
EventManager();
EventManager(EventManager const&);
void operator=(EventManager const&);
};
然后是类定义:
#include "EventManager.h"
EventManager &EventManager::getInstance()
{
static EventManager instance;
return instance;
}
EventManager::~EventManager() {}
EventManager::EventManager() {}
void EventManager::operator=(EventManager const &) {}
void EventManager::handleCommand(struct android_app *app, int32_t cmd)
{
// Event handling code...
}
现在,当我尝试使用我的方法时:
void android_main(struct android_app *app)
{
EventManager &manager = EventManager::getInstance();
app->onAppCmd = manager.handleCommand();
}
我收到编译器错误:
reference to non-static member function must be called.
如果我尝试以下操作:
void android_main(struct android_app *app)
{
EventManager &manager = EventManager::getInstance();
app->onAppCmd = &manager.handleCommand();
}
我收到编译器错误:
cannot create a non-constant pointer to member function
.
无论如何,我可以在不使方法static
的情况下使这种方法起作用吗?对事件处理程序类的投注实践的任何建议也值得赞赏。谢谢。
在某些时候,你将不得不使用静态/自由函数/lambda。但仅此而已,其余的都可以使用对象以不同的方式完成。例如,您可以在此函数中使用单例:
void callback_wrapper1(struct android_app *app, int32_t cmd)
{
EventManager &manager = EventManager::getInstance();
// do singleton stuff here
}
void android_main(struct android_app *app)
{
app->onAppCmd = &callback_wrapper1;
}
如果您不喜欢回调中的单例,还可以使用android_app
中的专用字段将通用数据传递给回调:
void callback_wrapper2(struct android_app *app, int32_t cmd)
{
EventManager &manager = *static_cast<EventManager*>(app->userData);
// do what you want here
}
void android_main(struct android_app *app)
{
app->userData = static_cast<void *>(&EventManager::getInstance());
app->onAppCmd = &callback_wrapper2;
}