2013-10-04 64 views
1

我是新來的函數指針,我寫了一個小程序,其中主類使用Test類來填充帶有成員函數指針的列表。從我的主類我想調用ExeFuns()來調用每個成員函數,我不知道該怎麼做。任何幫助是極大的讚賞。謝謝。從向量列表調用成員函數指針

Test.h

Class Test{ 
    public : 
    void CallFun1(); 
    void CallFun2(); 

    void AddFuns(); 
    void ExeFuns();  
}; 

Test.cpp的

std::vector<void (Test::*)()> callist; 


void Test::AddFuns(){ 
    callist.push_back(&Test::CallFun1); 
    callist.push_back(&Test::CallFun2); 
} 


void Test::ExeFuns(){ 
    for (int i = 0 ; i<eventlist.size(); i++) 
    { 
    callist[i](); // error! 
    } 
} 

void Test::CallFun1(){ cout<<"Fun 1"<<endl; } 
void Test::CallFun2(){ cout<<"Fun 2"<<endl; } 

Main.cpp的

main() 
{ 
Test obj; 
obj.AddFuns(); 
obj.ExeFuns(); 
} 
+2

您需要一個對象來調用它們。 – chris

+0

如果你有一個兼容C++ 11的編譯器(幾乎所有的都是今天的編譯器),那麼你可能想看看['std :: function'](http://en.cppreference.com/w/cpp/utility/函數/函數)和['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind)。如果你沒有C++ 11,那麼[Boost.Function](http://www.boost.org/doc/libs/1_54_0/doc/html/function.html)和[Boost.Bind](http ://www.boost.org/doc/libs/1_54_0/libs/bind/bind.html)也是這樣做的。 –

+1

噢,你在ExeFuns循環中有一個錯誤的錯誤。 –

回答

1

總之,您需要。*或 - >運算符來調用成員方法。 另外,在代碼中有幾個編譯錯誤和一個越界訪問。 這裏是正確的做法,

void Test::ExeFuns(){ 
    for (int i = 0 ; i<callist.size(); i++) // also there is out of bounds access (usage of <=) in your code 
    { 
    (this->*callist[i])(); // or (*this.*callist[i])(); 
    } 
} 
+0

感謝您的意見。如果我使用vector :: pop_back(),如何得到相同的結果? – bMathew

+1

pop_back不返回任何值,因此你不能使用它來調用該方法,但仍然可以使用vector :: back()(this - > * callist.back())(); – Arun

0

那些不足尖rs獨立功能,它們是指向一個類的成員函數的指針。正如克里斯所說,你需要一個對象來打電話給他們。

檢查this SO問題。