我花了最后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()"时,会发生错误,其中声明它未在此范围内声明。我必须定义" OnFire"我觉得很奇怪。与"& villain ::"当它被定义在恶棍构造函数中时,但我发现的所有信息都表明它必须以这种方式完成,而且如果我不这样做,它确实会产生大量错误。
调用属于目标[0]的* OnFire()指针的正确语法是什么?
答案 0 :(得分:3)
调用指向成员函数的指针的语法非常糟糕。这是正确的语法:
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的答案中所述。
答案 1 :(得分:2)
更改
if(targets[0]->*OnFire() == true)
到
if((targets[0]->*(targets[0]->OnFire))() == true)
由于函数调用运算符()
的优先级高于->*
,因此第一种形式被解释为:
if(targets[0]->*(OnFire()) == true)
,正如您所看到的,这不是您想要的。
答案 2 :(得分:1)
没有"正确的语法"。这将是残暴的(见下文)
改为使用std::function
:
#include <functional>
struct villain
{
villain();
//lots of other stuff
bool Type1EnemyBlasts() {return true;}
bool Type2EnemyBlasts() {return false;}
std::function<bool(villain&)> OnFire;
};
villain::villain()
{
OnFire = &villain::Type1EnemyBlasts;
}
int main()
{
villain *targets[100];
targets[0] = new villain();
villain& v = *targets[0];
if (v.OnFire(v))
{
return 1;
}
return 0;
}
与指向成员函数的指针对比:
struct villain
{
villain();
//lots of other stuff
bool Type1EnemyBlasts() {return true;}
bool Type2EnemyBlasts() {return false;}
bool (villain::*OnFire)();
};
villain::villain()
{
//lots of other stuff
OnFire = &villain::Type1EnemyBlasts;
}
int main()
{
//lots and lots of other stuff
villain *targets[100];
targets[0] = new villain();
villain& v = *targets[0];
if ((v.*v.OnFire)())
{
return 1;
}
return 0;
}
答案 3 :(得分:0)
尝试:
(targets[0]->*OnFire)()
这有关于函数指针的一些很好的信息:http://www.newty.de/fpt/fpt.html#defi