Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 781
Adam Avatar asked May 02 '13 01:05

Adam


People also ask

Can you have an array of functions C?

Array Functions in C is a type of data structure that holds multiple elements of the same data type. The size of an array is fixed and the elements are collected in a sequential manner. There can be different dimensions of arrays and C programming does not limit the number of dimensions in an Array.

Can there be an array of functions?

An array as a function argument.Arrays are always passed-by-pointer to functions, which means that array arguments can pass data into functions, out of functions, or both in and out of functions.

Can you return arrays from functions in C?

C programming does not allow to return an entire array as an argument to a function. However, you can return a pointer to an array by specifying the array's name without an index.


2 Answers

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) ();
like image 190
Antimony Avatar answered Sep 23 '22 02:09

Antimony


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;
}
like image 40
Armen B Avatar answered Sep 26 '22 02:09

Armen B