C++声明函数指针数组

C++ Declaring An Array Of Function Pointers

本文关键字:数组 指针 函数 声明 C++      更新时间:2023-10-16

基本上我需要实现一个事件处理程序类,但遇到了一个错误,我无法声明一个空数组:

class SomeClass
{
public:
    void registerEventHandler(int event, void (*handler)(std::string));
private:
    // here i get this error: declaration of ‘eventHandlers’ as array of void
    void (*eventHandlers)(std::string)[TOTAL_EVENTS];
}
void SomeClass::registerEventHandler(int event, void (*handler)(std::string))
{
    eventHandlers[event] = handler;
}

void handler1(std::string response)
{
    printf("ON_INIT_EVENT handlern");
}
void handler2(std::string response)
{
    printf("ON_READY_EVENT handlern");
}
void main()
{
    someClass.registerEventHandler(ON_INIT_EVENT, handler1);
    someClass.registerEventHandler(ON_READY_EVENT, handler2);
}

你能帮我弄清楚确切的语法吗?谢谢

这不是空洞的数组。它是函数指针数组。您应该定义如下:

void (*eventHandlers[TOTAL_EVENTS])(std::string);

或者更好(C++14):

using event_handler = void(*)(std::string);
event_handler handlers[TOTAL_EVENTS];

或C++03:

typedef void(*event_handler)(std::string);
event_handler handlers[TOTAL_EVENTS];

但我更建议使用矢量:

using event_handler = void(*)(std::string);
std::vector<event_handler> handlers;

您将eventHandles定义为返回5个voids数组的函数的指针,这不是您想要的。

与其试图在一行中完成这项工作,不如使用typedef:来更容易、更可读

typedef void (*event_handler_t)(std::string);
event_handler_t eventHandlers[TOTAL_EVENTS];

您混合了事件处理程序类型和数组定义。用typedef:分隔

typedef void(*eventHandler)(std::string);
eventHandler eventHandlers[TOTAL_EVENTS];