试图找出switch语句的替代方法

时间:2014-10-07 08:18:37

标签: c++ arrays qt pointers switch-statement

我目前正在尝试找出一种替换switch语句的方法,因为我有switch语句的程序变得非常冗长和令人困惑。因此我认为使用函数指针数组是个好主意。我正在使用c ++和qt。但是当我尝试实现时,我收到以下错误。

cannot convert 'CheckPl::comA' from type 'void (CheckPl::)()' to type 'void (*)()'

如果有人能帮我解决这个问题或者至少指出我纠正方向,我将不胜感激。

2 个答案:

答案 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)();

关于上述语法最难记住的是需要额外的括号集。