2013-05-02 2 views
2

Я пытаюсь справиться с целым рядом функций, однако, когда я назначить функции для массива (в конструкторе по умолчанию для класса) Я поздоровался с сообщением об ошибке:C++ Массив функций

" недействительный (GameObject :: *)() «не может быть использован для инициализации объекта типа„AlarmFunction“»

всего кода решение это следующим образом, все это в файле заголовок:

#include "stdafx.h" 
#include <Windows.h> 

typedef int (*AlarmFunction)(); 

class GameObject 
{ 
protected: 
GameObject() 
{ 
    AlarmFunction alarmF[12] = 
    { 
     AlarmEvent1, 
     AlarmEvent2, 
     AlarmEvent3, 
     AlarmEvent4, 
     AlarmEvent5, 
     AlarmEvent6, 
     AlarmEvent7, 
     AlarmEvent8, 
     AlarmEvent9, 
     AlarmEvent10, 
     AlarmEvent11, 
     AlarmEvent12 
    }; 
} 
//private default constructor 
~GameObject(); 
int instance_id; 
int object_id; 
int alarm[12]; 
void AlarmEvent1(); 
void AlarmEvent2(); 
void AlarmEvent3(); 
void AlarmEvent4(); 
void AlarmEvent5(); 
void AlarmEvent6(); 
void AlarmEvent7(); 
void AlarmEvent8(); 
void AlarmEvent9(); 
void AlarmEvent10(); 
void AlarmEvent11(); 
void AlarmEvent12(); 
AlarmFunction alarmF[12]; 

public: 
void AlarmTick() 
{ 
    for (int i=0;i<=11;i++) 
    { 
     if (alarm[i] > -1) 
     { 
      alarm[i]--; 
     } 
     else 
     { 
      if (alarm[i] == 0) 
      { 
       alarmF[i](); 
      } 
     } 
    } 
} 

Я не могу найти много в Интернете об этой ошибке или о том, как ее исправить, и был бы признателен, если бы кто-нибудь мог пролить свет на ошибку для меня.

+0

Вы уверены, что эти 12 событий не могут быть сконденсированы в одну функцию? – chris

ответ

5

Это потому, что вы пытаетесь назначить указатель на функцию-член в поле типа указателя на свободную функцию. Они несовместимые типы.

Я не уверен в точном синтаксисе, так как мне не приходилось иметь дело с необработанными указателями на функции-члены (std::function - это лучше для большинства случаев), но вы можете попробовать что-то подобное, чтобы увидеть, работает ли оно.

class GameObject; 
typedef int (GameObject::*AlarmFunction)(); 
+0

Я не совсем понимаю, но есть ли способ сделать эту работу? Я перефразировал это из учебника, который я нашел, поэтому предположил, что это сработало. – Adam

+0

@ Функции члена Адама имеют неявный параметр 'this', поэтому они не совместимы с функциями, не являющимися членами. Отсюда необходимость дополнительного украшения в typedef. – Dave

+0

А вот это, казалось, прояснило проблему, большое спасибо :) Однако, как только я исправил, что получил новую ошибку, просто сказал мне: «массив функций не допускается» – Adam

1

Как @Antimony сказал, типы несовместимы.

Что вы могли бы сделать что-то похожее на это:

Вместо того, чтобы объявить недействительными функции

void AlarmEvent1(); 
void AlarmEvent2(); 
void AlarmEvent3(); 
void AlarmEvent4(); 
void AlarmEvent5(); 
void AlarmEvent6(); 
void AlarmEvent7(); 
void AlarmEvent8(); 
void AlarmEvent9(); 
void AlarmEvent10(); 
void AlarmEvent11(); 
void AlarmEvent12(); 

Вы можете объявить их следующим образом:

int AlarmEvent1() {return 1}; 
int AlarmEvent2() {return 1}; 
int AlarmEvent3() {return 1}; 
int AlarmEvent4() {return 1}; 
//So on 

Таким образом, вы можете добавить их в ваш массив и использовать их.

Я еще не пытался его скомпилировать, но он должен работать или, по крайней мере, для вас есть направление.

Пожалуйста, исправьте меня, если я ошибаюсь.

Смежные вопросы