类成员作为 C++ 中 C 样式事件的事件处理程序

Class member as an event handler for a C-style event in C++

本文关键字:事件 样式 事件处理 程序 成员 C++      更新时间:2023-10-16

我正在使用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;
}