正确实现类函数数组

问题描述 投票:0回答:1

我想制作一个已知大小的类函数数组。为此,我尝试使用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;
)
c++ arrays typedef class-method
1个回答
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并调用不带参数的所有方法。

© www.soinside.com 2019 - 2024. All rights reserved.