我目前正在尝试找出一种替换switch语句的方法,因为我有switch语句的程序变得非常冗长和令人困惑。因此我认为使用函数指针数组是个好主意。我正在使用c ++和qt。但是当我尝试实现时,我收到以下错误。
cannot convert 'CheckPl::comA' from type 'void (CheckPl::)()' to type 'void (*)()'
如果有人能帮我解决这个问题或者至少指出我纠正方向,我将不胜感激。
答案 0 :(得分:1)
[...]切换语句的替代方法作为程序我有switch语句变得非常冗长和令人困惑。
将每个案例块提取到一个单独的函数中;这样,交换机从10km长的功能变为分派功能:
void dispatch_function()
{
switch(x)
{
case 1: do_case_1(); break;
...
case n: do_case_n(); break;
}
}
因此我认为使用函数指针数组是个好主意。
这不是一个好主意(特别是,不是你的方式 - 你正在解决xy problem)。在C ++中,当您需要在类似条件下调用的多个函数时,您需要抽象接口。
您生成的客户端代码应如下所示:
std::vector<handlers> handlers; // filled with handler instances, one for each case
for(const auto& h: handlers) // replaces switch
if(h.fits_case(x)) // replaces case statement
{
h.do_case(x); // replaces case block
break;
}
接下来你的处理程序类应该从这样的基类继承:
class handler_base
{
virtual bool fits_case(int x) = 0;
virtual void do_case(int x) = 0;
}
这很容易理解(在实现和客户端代码中),它是模块化的,可测试的(您可以单独测试每个案例)和可扩展(如果您需要一个新案例,您只需添加案例并将其添加到矢量中);它也没有使用任何指针。
答案 1 :(得分:0)
指向成员函数的指针必须存储在适当类型的变量中。指向成员函数的指针与指向函数的指针不兼容。
void (CheckPl::*mptr)() = &CheckPl::comA;
指向成员函数的指针需要一个实例到一个对象进行调用。
CheckPl c;
CheckPl *cp = &c;
(c.*mptr)();
(cp->*mptr)();
关于上述语法最难记住的是需要额外的括号集。