Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试图找出switch语句的替代方法_C++_Arrays_Qt_Pointers_Switch Statement - Fatal编程技术网

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

C++ 试图找出switch语句的替代方法,c++,arrays,qt,pointers,switch-statement,C++,Arrays,Qt,Pointers,Switch Statement,我目前正试图找出一种替代switch语句的方法,因为我的程序switch语句变得非常长而且令人困惑。因此,我认为使用指向函数的指针数组是一个好主意。我用C++和Qt。但是当我尝试实现时,我得到了以下错误 无法将“CheckPl::comA”从类型“void(CheckPl::)()”转换为类型“void(*)()” 如果有人能帮我解决这个问题,或者至少给我指出正确的方向,我将不胜感激 指向成员函数的指针必须存储在适当类型的变量中。指向成员函数的指针与指向函数的指针不兼容 void (Ch

我目前正试图找出一种替代switch语句的方法,因为我的程序switch语句变得非常长而且令人困惑。因此,我认为使用指向函数的指针数组是一个好主意。我用C++和Qt。但是当我尝试实现时,我得到了以下错误

无法将“CheckPl::comA”从类型“void(CheckPl::)()”转换为类型“void(*)()”


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

指向成员函数的指针必须存储在适当类型的变量中。指向成员函数的指针与指向函数的指针不兼容

    void (CheckPl::*mptr)() = &CheckPl::comA;

指向成员函数的指针要求调用对象的实例

    CheckPl c;
    CheckPl *cp = &c;
    (c.*mptr)();
    (cp->*mptr)();
关于上述语法,最难记住的是需要额外的一组括号

[…]switch语句的替代方法因为我的程序switch语句变得非常长而且令人困惑

将每个case块提取为单独的函数;这样,交换机从10公里长的功能变为调度功能:

void dispatch_function()
{
    switch(x)
    {
    case 1: do_case_1(); break;
    ... 
    case n: do_case_n(); break;
    }
}
因此,我认为使用指向函数的指针数组是一个好主意

这不是一个好主意(特别是,不是以你的方式进行的——你正在解决问题)。在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;
}

这很容易理解(在实现和客户机代码中),它是模块化的、可测试的(您可以单独测试每个案例)和可扩展的(如果您需要新案例,您只需添加案例并将其添加到向量);它也不使用任何指针。

似乎无法将
CheckPI
的指向成员函数的指针转换为指向函数的指针。如果你愿意,我们甚至可以帮你!