2015-02-05 3 views
3

В принципе мне нужно реализовать класс обработчика событий, но впадать в ошибку, что я не могу объявить массив пустот:C++ Объявление массива указателей на функции

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 handler\n"); 
} 
void handler2(std::string response) 
{ 
    printf("ON_READY_EVENT handler\n"); 
} 

void main() 
{ 
    someClass.registerEventHandler(ON_INIT_EVENT, handler1); 
    someClass.registerEventHandler(ON_READY_EVENT, handler2); 
} 

Можете ли вы помочь мне выяснить точный синтаксис ? Спасибо!

ответ

9

Это не массив пустот. Это массив указателей на функции. Вы должны были определить его следующим образом:

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; 
+0

Спасибо, что сработало! –

+1

Кроме того, рассмотрим 'использование event_handler = std :: function ' - он примет большее количество вызываемых объектов, а не только функции, но также лямбда-выражения и т. Д. – MSalters

+0

... и добавьте огромный накладные расходы – cubuspl42

3

Вы определяете eventHandles как указатель на функцию, возвращающую массив из 5 void s, который не является тем, что вы намеревались.

Вместо того, чтобы пытаться сделать это в одной строке, будет легче и более удобным для чтения с помощью typedef:

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

Вы смешанный тип обработчика событий и определение массива. Отдельно с typedef:

typedef void(*eventHandler)(std::string); 
eventHandler eventHandlers[TOTAL_EVENTS]; 
Смежные вопросы