Adam
Adam

Reputation: 331

C++ Array of Functions

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

Answers (3)

Armen B
Armen B

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

Thang Do
Thang Do

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

Antimony
Antimony

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

Related Questions