[英]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.