函数指针的初始化数组

时间:2011-11-14 10:59:48

标签: c++ arrays visual-studio-2010 function pointers

说明: 我正在基于FSM模式的VS2010基本计算器编码。所以,我需要行动地图。

如何在C ++中正确初始化指向函数的静态二维数组? 我已经尝试了

static void (*action_map[])() = {A, pA}; //one dimension for example

static void (*action_map[])() = {&A, &pA};

和许多其他人都不起作用。

ADDED

一切都应该在课堂上完成。 以下示例对我不起作用

public class A {
public:
    void func1() { cout << "func1\n"; }
    void func2() { cout << "func2\n"; }
    void func3() { cout << "func3\n"; }
    void func4() { cout << "func4\n"; }
    typedef void (*function_t)();
    function_t function_array[2][2];
    A();

};

A::A() 
{
    function_array[2][2] = { { func1, func2}, { func3, func4 } };
};

int main(array<System::String ^> ^args)
{
    A * tst = new A();
    for (int i = 0; i < 2; i++)
        {
    for (int j = 0; j < 2; j++)
        {
        tst->function_array[i][j]();
        }
    }
    return 0;
}

请指出我做错了什么。

4 个答案:

答案 0 :(得分:1)

注意'function_t'类型已更改:

class A
{
public:
    void func1() { cout << "func1()\n"; }
    void func2() { cout << "func2()\n"; }
    void func3() { cout << "func3()\n"; }
    void func4() { cout << "func4()\n"; }
    typedef void (A::*function_t)();
    static const function_t function_array[2][2];
};

const A::function_t A::function_array[2][2] = { { &A::func1, &A::func2 },
                                                { &A::func3, &A::func4 }
                                              };

// Example use.
A my_a;
for (int i = 0; i < 2; i++)
{
    for (int j = 0; j < 2; j++)
    {
        std::mem_fn(A::function_array[i][j])(my_a);
    }
} 

如果数组'function_array'在类实例之间是可更改的,则'static const'不合适,必须在构造函数中填充。

答案 1 :(得分:1)

如果您的编译器支持C ++ 11初始化列表,那么您只需要在分配中删除虚假数组大小。

A::A() 
{
    function_array = { { func1, func2}, { func3, func4 } };
}

或者更好的是,直接初始化它,而不是在默认初始化后分配:

A::A() : function_array { { func1, func2}, { func3, func4 } }
{}

如果你的编译器不支持C ++ 11,你需要手动分配它们:

A::A()
{
    function_array[0][0] = func1;
    function_array[0][1] = func2;
    function_array[1][0] = func3;
    function_array[1][1] = func4;
}

您还需要创建函数static以便存储简单的函数指针;如果它们必须是非静态成员,那么您将需要存储成员函数指针并使用类实例调用它们,或者存储使用std::function(或其Boost)创建的std::bind个对象如果您没有C ++ 11,则等效。

答案 2 :(得分:0)

如果ApA是不带参数且返回void类型的函数的名称,则它们都很好。

答案 3 :(得分:0)

由于您正在使用已实现许多C ++ 11功能的MSVS2010,如何执行此操作:

void f1() {}
void f2() {}
void f3() {}
void f4() {}

std::vector<std::function<void()>> action_map = {f1, f2, f3, f4};

for(size_t i = 0 ; i < action_map.size(); ++i)
{
     action_map[i](); //invoke action!
}