gpt4 book ai didi

c++ - 正确实现类函数数组

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:08 27 4
gpt4 key购买 nike

我想制作一个已知大小的类函数数组。为此,我尝试使用 typedef,但到目前为止还没有成功。此外,有些函数不带参数。 F(),但其他人做 ex。 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;
};

我更改了别名的名称,因为它只是函数指针的类型而不是数组。 usingtypedef 更容易阅读(它遵循更常见的 x = something 风格)。

当您调用函数 G 时,参数 n 必须来自某个地方,因此您可以先调用 set_n 而不是直接传递它迭代数组并调用所有不带参数的方法。

关于c++ - 正确实现类函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58996602/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com