我想制作一个已知大小的类函数数组。为此,我尝试使用typedef,但到目前为止尚未奏效。另外,某些函数不带参数ex。 F(),但其他人也这样做。 G(int n),在typedef中,我不知道如何告诉它不接受某些参数(尝试过void,但它说它不是类型),而不接受其他参数。
class myClass
{
// An array of void functions
typedef void(myClass::*arrayOfFunctions)();
private:
arrayOfFunctions array[3] = { &myClass::F, &myClass::G, &myClass::H };
void F() { do stuff; }
void G(int n) { do stuff involving n; }
void H() { do stuff; }
};
我尝试过的:我已经成功地在main中创建了一个void函数数组,其中没有涉及到的类,需要时可以调用这些类,因此,问题的一部分似乎是在一个类中实现它并使用其类函数。
// This works:
typedef void(*arrayOfFunctions)();
void Action1()
{
// stuff 1
}
void Action2()
{
// stuff 2
}
void Action3()
{
//stuff3
}
int main()
{
arrayOfFunctions functionArray[] = { Action1, Action2, Action3 };
// Call Action1
functionArray[0]();
return 0;
)
如评论中所提到,不可能直接进行。您不能将不同类型的对象存储在同一数组中。但是,有一些方法可以实现您想要的。如何到达那里非常取决于细节。最晚在调用函数时,您需要知道要传递多少个参数。
在您的示例中,一种可能性是重构为仅具有不带参数的方法:
class myClass {
using memFun = void(myClass::*)();
void set_n(int x) { n = x; }
private:
memFun array[3] = { &myClass::F, &myClass::G, &myClass::H };
void F() { do stuff; }
void G() { do stuff involving n; }
void H() { do stuff; }
int n;
};
我更改了别名的名称,因为它只是函数指针的类型而不是数组。 using
比typedef
更易于阅读(它遵循更常见的x = something
样式)。
[当您调用函数G
时,参数n
必须来自某个地方,因此,除了直接传递参数外,您还可以在迭代数组之前调用set_n
并调用不带参数的所有方法。