说明: 我正在基于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;
}
请指出我做错了什么。
答案 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)
如果A
和pA
是不带参数且返回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!
}