gpt4 book ai didi

C++ 指向不在范围内的函数调用的指针

转载 作者:可可西里 更新时间:2023-11-01 18:35:49 26 4
gpt4 key购买 nike

我花了过去 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::”来定义它,这让我觉得很奇怪,但我发现的所有信息都表明它必须以这种方式完成,而且它确实搅动了如果我尝试其他方式,则会出现大量错误。

调用属于 targets[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)

按照 sehe 的回答中所述,使用宏或使用 std::function

关于C++ 指向不在范围内的函数调用的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23119885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com