簡體   English   中英

C ++指向函數調用的指針不在范圍內

[英]C++ Pointer to function call not in scope

我花了最后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頁面調用指向成員函數的指針建議為此目的定義宏 - 並注意這些頁面的作者不喜歡宏。

#define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))

...

 if (CALL_MEMBER_FN(*targets[0],targets[0]->OnFire)() == true)

使用宏或使用std::function ,如sehe的答案中所述。

更改

if(targets[0]->*OnFire() == true)

if((targets[0]->*(targets[0]->OnFire))() == true)

由於函數調用運算符()優先級高於->* ,因此第一種形式被解釋為:

if(targets[0]->*(OnFire()) == true)

正如你所看到的,這不是你想要的。

沒有“正確的語法”。 這將是殘暴的(見下文)

使用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;
}

嘗試:( (targets[0]->*OnFire)()

這有關於函數指針的一些很好的信息: http//www.newty.de/fpt/fpt.html#defi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM