鱼C论坛

 找回密码
 立即注册
查看: 1430|回复: 13

函数值返回问题

[复制链接]
发表于 2021-9-11 11:44:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
m_mapFunction是一个映射表

                               
登录/注册后可看大图
int CCommand::ExcuteCommand(int nCmd)
{
        std::map<int, CMDFUNC>::iterator it = m_mapFunction.find(nCmd);        
        if (it == m_mapFunction.end())
        {
                return -1;
        }
        return (this-> *it ->second)();                        
        return  (this->*m_mapFunction.find(nCmd)->second)();

[/code]

为什么return (this-> *it ->second)()不可以,return  (this->*m_mapFunction.find(nCmd)->second)()却可以,
*it = *m_mapFunction.find(nCmd) 地址也是一样的???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-11 11:46:07 | 显示全部楼层
虽然说功能能实现,也没啥问题,但是看别人(this-> *it ->second)()可以调用函数,为什么我这里就不行了喃?想了解下原理!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-11 16:27:29 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-11 16:29 编辑

我理解不知道对不对,类里有*m_mapFunction.find(nCmd)这个成员,没有*it这个成员吧?
你可以用什么方法调用这个函数指针*it,但它不是类里的成员。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-11 17:19:28 | 显示全部楼层
2021年9月11日17:17:43
this 是 啥
it  是 内部 变量
就算 你 外面有 it 变量 也会被 覆盖
这里的 it 就算 内部的 变量 it
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-11 18:13:32 | 显示全部楼层
Mondayisgood 发表于 2021-9-11 17:19
2021年9月11日17:17:43
this 是 啥
it  是 内部 变量

this是类的指针.....,每个类都有this指针的
是局部变量,所以我在函数内部用它没毛病吧,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-11 18:16:32 | 显示全部楼层
jhq999 发表于 2021-9-11 16:27
我理解不知道对不对,类里有*m_mapFunction.find(nCmd)这个成员,没有*it这个成员吧?
你可以用什么方法调 ...

指针只不过是一个地址,只要获取对应的地址就可以了it= m_mapFunction.find(nCmd),
所以*it  =  *m_mapFunction.find(nCmd),
*it得出的是函数地址,所以直接调用没毛病
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-11 18:21:23 | 显示全部楼层
2736946915 发表于 2021-9-11 18:16
指针只不过是一个地址,只要获取对应的地址就可以了it= m_mapFunction.find(nCmd),
所以*it  =  *m_mapF ...

int (CCommand::*t)(int)= &CCommand::*m_mapFunction.find(nCmd);
试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-11 18:26:21 | 显示全部楼层
jhq999 发表于 2021-9-11 18:21
int (CCommand::*t)(int)= &CCommand::*m_mapFunction.find(nCmd);
试试

CCommand::*m_mapFunction.find(nCmd)这个返回的是一个迭代器,目的是用这个迭代器获得函数地址,&不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-11 18:40:41 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-11 18:41 编辑
2736946915 发表于 2021-9-11 18:26
CCommand::*m_mapFunction.find(nCmd)这个返回的是一个迭代器,目的是用这个迭代器获得函数地址,&不行


nt (CCommand::*t)= &CCommand::m_mapFunction;

然后返回 this->*t.find(nCmd)->second)();
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-11 18:43:59 | 显示全部楼层
jhq999 发表于 2021-9-11 18:40
nt (CCommand::*t)= &CCommand::m_mapFunction;

然后返回 this->*t.find(nCmd)->second)();

。这个可以啊,和我上面那个一样,但是我想知道原理,为啥一步到位不行,一步到位代码简洁些,便于观看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-11 18:45:36 | 显示全部楼层
2736946915 发表于 2021-9-11 18:43
。这个可以啊,和我上面那个一样,但是我想知道原理,为啥一步到位不行,一步到位代码简洁些,便于观看

因为find(int)不是this代表的类的成员
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-11 18:46:29 | 显示全部楼层
jhq999 发表于 2021-9-11 18:45
因为find(int)不是this代表的类的成员

不对哦,this调的是地址,汇编代码都一样哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-11 18:47:13 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-11 18:57 编辑
2736946915 发表于 2021-9-11 18:46
不对哦,this调的是地址,汇编代码都一样哦


this是类的实例化后实例的指针,
我看你帖子得到启发
如果用c++编写必须实例化
除非是静态函数
A a;
i=(a.*t)(2,1);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-11 19:10:23 | 显示全部楼层

it

本帖最后由 jhq999 于 2021-9-11 19:12 编辑

return *it ->second)();怎么样?
或者在头文件声明it
再用
return (this-> *it ->second)();
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 07:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表