5

我正在尝试处理一组函数,但是当我将函数分配给数组时(在类的默认构造函数中),我收到了错误消息:

“void (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]();
            }
        }
    }
}

我在网上找不到太多关于这个错误或如何修复它的信息,如果有人能为我解释这个错误,我将不胜感激。

4

3 回答 3

7

那是因为您试图将指向成员函数的指针分配给指向自由函数的指针类型的字段。它们是不兼容的类型。

我不确定确切的语法,因为我不必处理指向成员函数的原始指针(std::function无论如何对于大多数情况来说更好),但你可以尝试这样的事情来看看它是否有效。

class GameObject;
typedef int (GameObject::*AlarmFunction) ();
于 2013-05-02T01:44:44.487 回答
1

就像@Antimony 所说,这些类型是不兼容的。

你可以做的是类似于这样的事情:

而不是声明 void 函数

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

这样,您可以将它们添加到您的阵列中并使用它们。

我还没有尝试编译它,但它应该可以工作,或者至少你的方向在那里。

如果我错了,请纠正我。

于 2013-05-02T01:55:03.460 回答
1

我对 c++ 了解不多,但我在用 C 编码时也遇到了与您相同的问题,而不是将函数的名称传递给函数数组,而是将函数的地址存储在数组中,然后使用调用函数的数组指针

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;
}
于 2020-12-14T01:28:32.243 回答