我花了最后3个小时试图弄清楚我做错了什么.我只需要另外一些眼睛,我已经尝试了我能想到的一切,甚至各种随机排列,试图让编译器告诉我一些有用的东西.
这是我现在的位置:
码:
class villain { public: villain(); //lots of other stuff bool Type1EnemyBlasts(); bool Type2EnemyBlasts(); bool (villain::*OnFire)(); }; villain::villain() { //lots of other stuff OnFire = &villain::Type1EnemyBlasts; } main { //lots and lots of other stuff villain *targets[100]; targets[0] = new villain(); if(targets[0]->*OnFire() == true) { //do stuff } }
当我调用“targets [0] – > * OnFire()”时会发生错误,其中声明它未在此范围内声明.当我在恶棍构造函数中定义它时,我必须用“& villain ::”来定义“OnFire”,这让我觉得很奇怪,但我发现的所有信息都表明它必须以这种方式完成,事实上它如果我不这么做的话会产生很多错误.
调用属于目标[0]的* OnFire()指针的正确语法是什么?
解决方法
调用指向成员函数的指针的语法非常糟糕.这是正确的语法:
if ((targets[0]->*(targets[0]->OnFire))() == true)
那是彻头彻尾的丑陋.这就是为什么Parashift C++ FAQ page on calling pointers to member functions建议为此目的定义一个宏 – 并注意这些页面的作者不喜欢宏.
#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) ... if (CALL_MEMBER_FN(*targets[0],targets[0]->OnFire)() == true)
使用宏或使用std :: function,如sehe的答案中所述.
原文地址:https://www.jb51.cc/c/117979.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。