gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:43:43 25 4
gpt4 key购买 nike

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

我得到编译器错误:

无法创建指向成员函数的非常量指针

我是否可以在不使方法 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;
}

关于c++ - 在 C++ 中作为 C 样式事件的事件处理程序的类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58082456/

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