关于Qt下switch...case 语句改写的问题,求大神们支招。。

_Ryan_Wang 2014-05-12 09:57:05
因为项目需要扩展功能,原先用以下形式写的语句太多了。想换写法,
switch(TYPE)
{
case TYPE1:
emit signalTypeOne(TYPE);
break;
case TYPE2:
emit signalTypeTwo(TYPE);
break;
...
default:
break;
}

在网上查了查貌似有两种形式:查表或者State模式。
如果应用表驱动的话,Qt的signal是否能有函数指针呢,怎么建立保存数据的结构呢?
如果用state模式,我应该怎么设计呢?(感觉以上形式的代码不适用与state模式。。)
还有没有更好的或者更简单的方法呢?
...全文
1043 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Ryan_Wang 2014-06-13
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
建议楼主别换。 不要小觑编译器release版对复杂switch语句的优化能力(转换为跳转表结构)。
赵老师说的我放心了。。。。
_Ryan_Wang 2014-05-12
  • 打赏
  • 举报
回复
按照3楼哥们的方法, 我把
typedef void (*fun_t)(int32 type);
typedef struct
{
    int type;
    fun_t fun;
}list_t;
放到了头文件,类定义的外面。 把
const static list_t lists[];
放到了私有变量,并在cpp文件中声明。 但是编译器报错 错误:argument of type 'void (OperatingArea::)(int)' does not match 'void (*)(int)';求解答 [quote=引用 2 楼 turingo 的回复:] 用函数指针列表试试:

typedef void (*fun_t)(int type);
typedef struct
{
    int type;
    fun_t fun;
}list_t;

static const list_t lists[] =
{
    {TYPE1, signalTypeOne},
   {TYPE2, signalTypeTow},
  ...
};

...

图灵狗 2014-05-12
  • 打赏
  • 举报
回复
用函数指针列表试试:

typedef void (*fun_t)(int type);
typedef struct
{
    int type;
    fun_t fun;
}list_t;

static const list_t lists[] =
{
    {TYPE1, signalTypeOne},
   {TYPE2, signalTypeTow},
  ...
};

...

引用 楼主 u012560967 的回复:
因为项目需要扩展功能,原先用以下形式写的语句太多了。想换写法,
switch(TYPE)
{
    case TYPE1:
            emit signalTypeOne(TYPE);
             break;
    case TYPE2:
           emit signalTypeTwo(TYPE);
           break;
...
     default:
     break;
}
在网上查了查貌似有两种形式:查表或者State模式。 如果应用表驱动的话,Qt的signal是否能有函数指针呢,怎么建立保存数据的结构呢? 如果用state模式,我应该怎么设计呢?(感觉以上形式的代码不适用与state模式。。) 还有没有更好的或者更简单的方法呢?
accsoar 2014-05-12
  • 打赏
  • 举报
回复
你应该去Qt版的
赵4老师 2014-05-12
  • 打赏
  • 举报
回复
建议楼主别换。 不要小觑编译器release版对复杂switch语句的优化能力(转换为跳转表结构)。
dbzhang800 2014-05-12
  • 打赏
  • 举报
回复
引用 4 楼 u012560967 的回复:
Qt中signal函数不能定义成static的,所以会出楼上的error
你可以定义成成员函数指针啊
_Ryan_Wang 2014-05-12
  • 打赏
  • 举报
回复
Qt中signal函数不能定义成static的,所以会出楼上的error [quote=引用 2 楼 turingo 的回复:] 用函数指针列表试试:

typedef void (*fun_t)(int type);
typedef struct
{
    int type;
    fun_t fun;
}list_t;

static const list_t lists[] =
{
    {TYPE1, signalTypeOne},
   {TYPE2, signalTypeTow},
  ...
};

...

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧