C++ C++&引用;不允许使用不完整的类型“;尝试在类内创建函数数组

C++ C++&引用;不允许使用不完整的类型“;尝试在类内创建函数数组,c++,arrays,function,pointers,C++,Arrays,Function,Pointers,我如何得到下面的代码示例,它可以编译并在类中正常工作 下面的代码工作得很好 #include <iostream> using namespace std; typedef int (*IntFunctionWithOneParameter) (int a); int function(int a){ return a; } int functionTimesTwo(int a){ return a*2; } int functionDivideByTwo(int a){ re

我如何得到下面的代码示例,它可以编译并在类中正常工作


下面的代码工作得很好

#include <iostream>
using namespace std;

typedef int (*IntFunctionWithOneParameter) (int a);

int function(int a){ return a; }
int functionTimesTwo(int a){ return a*2; }
int functionDivideByTwo(int a){ return a/2; }

void main()
{
    IntFunctionWithOneParameter functions[] = 
    {
        function, 
        functionTimesTwo, 
        functionDivideByTwo
    };

    for(int i = 0; i < 3; ++i)
    {
        cout << functions[i](8) << endl;
    }
}
所以我的问题是如何让它在我的类中工作,因为它是唯一需要函数的地方,这意味着我确实需要在main()或其他地方访问函数


编辑
这就是为什么我需要一个“函数数组”。在我制作软件(vst)合成器时,为了节省花费在“如果”或更准确地说“开关”上的时间,在处理过程中花费的时间越少,用户在任何给定时间可以播放的音符(复调)就越多。并乘以44100次/秒,该功能运行时,有8个音调发生器,每个发生器最多可以有16个和声,因此,实际上所需的功能,可能会被调用高达5644800次/秒,每个音符播放!这个主回路中需要的确切功能在进入回路之前就已经知道了,只有在用户调整旋钮时才会改变,所以我确实希望避免使用ifs和开关。现在,如果只有一个功能偶尔会发生变化,我就可以复制主回路,每个功能都有可能发生变化,但是主音频处理回路有几个区域,每个区域都有各种不断增长的功能,每个功能只有在用户更改各种旋钮时才会发生变化。因此,虽然我可以,但我不会制作5*20*23(以及不断增长的)不同版本的主循环,以避免if和开关。

您发布的代码有很多问题:

  • 类定义后没有分号
  • Class
    而不是
    Class
  • 没有为
    函数
    成员设置固定大小,这是不允许的。您需要显式设置数组的大小
  • 成员函数指针与“常规”函数指针不同。成员函数指针有一个隐式
    this
    作为第一个参数,因为它们需要调用一个对象。因此
    myFunction
    不是
    myarrayofffunctions
    类型。如果将
    myFunction
    myFunction2
    设置为静态,则可以将它们存储为常规函数指针。这是一种选择吗
  • MyArrayOfffunctions的名称非常混乱,因为它根本不是数组

除了最后一个之外,所有这些都会导致代码无法编译。

这个示例可能是您需要的

注意:为了方便测试,我已经将
typedef
语句改为
using
,并将函数的签名改为普通
int

class-myClass{
公众:
使用MyArrayOfffunctions=float(myClass::*)(int a、int b、float c);
浮点myFunction1(整数a、整数b、浮点c)
{
返回a*b*c;
}
浮点myFunction2(整数a、整数b、浮点c)
{
返回a+b+c;
}
MyArrayOfffunctions函数[2];
myClass()
{
函数[0]=&myClass::myFunction1;
函数[1]=&myClass::myFunction2;
};
void Invoke()
{
(此->*函数[0])(1,2,3);
(此->*函数[1])(3,2,1);
}
};
int main()
{
我的a级;
a、 调用();
(a.*(a.函数[0])(4,5,6);
返回0;
}
正如您所看到的,我得到了指向类函数的指针,但要调用它,我需要使用实际的对象(
this
invoke()函数中的对象和
main()中的对象)来调用它

您可以这样写:

class myClass
{
public:
    typedef float (*myArrayOfStaticFunctions) (int& a, int& b, float& c);
    typedef float (myClass::*myArrayOfFunctions) (int& a, int& b, float& c);

    static float myFunction1 (int& a, int& b, float& c){cout<<"myFunction1"<<endl; return 0;}
    static float myFunction2 (int& a, int& b, float& c){ cout<<"myFunction2"<<endl; return 0;}
    float myFunction3 (int& a, int& b, float& c){ cout<<"myFunction3"<<endl; return 0;}
    float myFunction4 (int& a, int& b, float& c){ cout<<"myFunction4"<<endl; return 0;}

    myArrayOfStaticFunctions    StaticArrayfunctions[2];
    myArrayOfFunctions          Arrayfunctions[2];

    myClass (){
        StaticArrayfunctions [0] =myFunction1;
        StaticArrayfunctions [1] =myFunction2;
        Arrayfunctions [0] = &myClass::myFunction3;
        Arrayfunctions [1] = &myClass::myFunction4;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    myClass m;
    int a =0, b=0; float c;

    m.StaticArrayfunctions[0] (a,b,c);
    m.StaticArrayfunctions[1] (a,b,c);

    myClass::myArrayOfFunctions func3 = m.Arrayfunctions[0];
    myClass::myArrayOfFunctions func4 = m.Arrayfunctions[1];

    (m.*func3)(a,b,c);
    (m.*func4)(a,b,c);

    return 0;
}
class-myClass
{
公众:
类型定义浮动(*myArrayOfStaticFunctions)(内部和a、内部和b、浮动和c);
typedef float(myClass::*myarrayofffunctions)(int&a、int&b、float&c);

静态浮动myFunction1(内部和a、内部和b、浮动和c){coutMember函数不是简单的函数指针。是否确实需要使用成员函数?如何知道必须调用它们的对象?错误消息是因为无法创建具有隐式大小的数组,如类或结构定义中的内联数组。必须指定大小,或改为使用
std::vector
。我还建议您打开关于函数指针一章的书,了解指向非成员函数的指针和指向成员函数的指针之间的区别。它们是不同的(如前所述)。您也可以对函数指针使用类型擦除,并使用例如。我可能没有使用正确的术语,但我编辑了一篇文章,展示了我在网上找到的一个示例,该示例编译并运行良好!您遇到的问题是由于函数是非静态成员函数。它本身并不意味着什么,您需要某种排序引用它的对象的名称。例如:
myClass owo;owo.function1()
好的,我只是快速输入了一些示例代码,我会尝试编辑以纠正错误。有人评论过吗,实际上看了我文章的下半部分,它显示的代码与我的类似,只是它不是在类中,编译和工作正常吗?@dkdivedode这是完全不同的代码:没有自由函数和类成员函数,没有n成员数组,…我看不出代码有什么不同,除了我的名字不同,它在一个类中,但让我编辑我的原始帖子并使用有效的代码。感谢这个想法,我可以使用。你知道我只需要在类本身中访问这些函数吗?如果你只想访问一个类,你不能直接调用它吗从类内访问它?创建函数数组有意义吗?创建函数数组的意义在于,在每秒运行44100次的音频处理关键循环中节省时间,并避免一堆if或开关,哪些函数只有在用户更改旋钮上的设置时才会更改。换句话说,当音频处理ing开始时,就知道需要什么函数,所以如果在主循环期间进行测试,则不需要花费时间“昂贵”,或者至少不需要浪费时间
class myClass
{
public:
    typedef float (*myArrayOfStaticFunctions) (int& a, int& b, float& c);
    typedef float (myClass::*myArrayOfFunctions) (int& a, int& b, float& c);

    static float myFunction1 (int& a, int& b, float& c){cout<<"myFunction1"<<endl; return 0;}
    static float myFunction2 (int& a, int& b, float& c){ cout<<"myFunction2"<<endl; return 0;}
    float myFunction3 (int& a, int& b, float& c){ cout<<"myFunction3"<<endl; return 0;}
    float myFunction4 (int& a, int& b, float& c){ cout<<"myFunction4"<<endl; return 0;}

    myArrayOfStaticFunctions    StaticArrayfunctions[2];
    myArrayOfFunctions          Arrayfunctions[2];

    myClass (){
        StaticArrayfunctions [0] =myFunction1;
        StaticArrayfunctions [1] =myFunction2;
        Arrayfunctions [0] = &myClass::myFunction3;
        Arrayfunctions [1] = &myClass::myFunction4;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    myClass m;
    int a =0, b=0; float c;

    m.StaticArrayfunctions[0] (a,b,c);
    m.StaticArrayfunctions[1] (a,b,c);

    myClass::myArrayOfFunctions func3 = m.Arrayfunctions[0];
    myClass::myArrayOfFunctions func4 = m.Arrayfunctions[1];

    (m.*func3)(a,b,c);
    (m.*func4)(a,b,c);

    return 0;
}