C++ 试图找出switch语句的替代方法
我目前正试图找出一种替代switch语句的方法,因为我的程序switch语句变得非常长而且令人困惑。因此,我认为使用指向函数的指针数组是一个好主意。我用C++和Qt。但是当我尝试实现时,我得到了以下错误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
无法将“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
的指向成员函数的指针转换为指向函数的指针。如果你愿意,我们甚至可以帮你!