Reputation: 331
I'm trying to deal with an array of functions, however when I assign the functions to the array (in the class's default constructor) I am greeted with the error message:
"void (GameObject::*)()" cannot be used to initialize an entity of type "AlarmFunction""
All code dealing with this is as follows, this is all in the header file:
#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]();
}
}
}
}
I can't find much on the web about this error or indeed how to fix it, and would be grateful if anyone could shed some light on the error for me.
Upvotes: 7
Views: 18723
Reputation: 41
I don't know much about c++ but I also ran into the same problem as you while coding in C and instead of passing the name of functions to an array of functions I stored in the array the addresses of the functions and then I use an array pointer to call the functions
int test1()
{
printf("hello\n");
return 0;
}
int test2()
{
printf("world\n");
return 1;
}
int main()
{
int n = -15;
int (*(functions[2]))() = {test1, test2};
n = functions[0]();
printf("%d\n", n);
return 0;
}
Upvotes: 4
Reputation: 316
Like @Antimony said, the types are incompatible.
What you could do is something similar to this:
Instead of declaring void functions
void AlarmEvent1();
void AlarmEvent2();
void AlarmEvent3();
void AlarmEvent4();
void AlarmEvent5();
void AlarmEvent6();
void AlarmEvent7();
void AlarmEvent8();
void AlarmEvent9();
void AlarmEvent10();
void AlarmEvent11();
void AlarmEvent12();
You can declare them as follow:
int AlarmEvent1() {return 1};
int AlarmEvent2() {return 1};
int AlarmEvent3() {return 1};
int AlarmEvent4() {return 1};
//So on
This way, you can add them to your array and use them.
I haven't tried to compile it yet, but it should work or at least the direction for you is there.
Please correct me if I'm wrong.
Upvotes: 1
Reputation: 39451
That's because you're trying to assign a pointer to member function to a field of type pointer to free function. They're incompatible types.
I'm not sure of the exact syntax since I haven't had to deal with raw pointers to member functions (std::function
is better for most cases anyway), but you could try something like this to see if it works.
class GameObject;
typedef int (GameObject::*AlarmFunction) ();
Upvotes: 8