use*_*913 7 c++ pointers scope function-pointers reference
我花了最后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
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用"targets [0] - >*OnFire()"时会发生错误,其中声明它未在此范围内声明.当我在恶棍构造函数中定义它时,我必须用"&villain ::"来定义"OnFire",这让我觉得很奇怪,但是我发现的所有信息都表明它必须以这种方式完成,而且确实它会搅动如果我不这样做,就会发生过多的错误.
调用属于目标[0]的*OnFire()指针的正确语法是什么?
调用成员函数指针的语法相当糟糕。这是正确的语法:
if ((targets[0]->*(targets[0]->OnFire))() == true)
Run Code Online (Sandbox Code Playgroud)
那是彻头彻尾的丑陋。这就是为什么Parashift C++ FAQ 页面关于调用成员函数的指针建议为此目的定义一个宏——并注意这些页面的作者不喜欢宏。
#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
...
if (CALL_MEMBER_FN(*targets[0],targets[0]->OnFire)() == true)
Run Code Online (Sandbox Code Playgroud)
使用宏或使用std::functionsehe 的答案中所述的 a 。