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

时间:2014-04-16 20:52:25

标签: c++ pointers reference scope function-pointers

我花了最后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()指针的正确语法是什么?

4 个答案:

答案 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