今天發現一個的問題:
#include <vector> #include <iostream> #include <algorithm> #include <functional> struct State { State( int state ) : m_state( state ){} ~State() { std::cout << "~State(), m_state=" << m_state << std::endl; } void setState( int state ){ m_state = state; } int getState() const{ return m_state; } void print() const { std::cout << "State::print: " << m_state << std::endl; } private: int m_state; }; //void Print(State *pstate) //全局函數 //{ // pstate->print(); //} class Printer //改用仿函數 { void operator()(State *pstate) { pstate->print(); } }; /* class Printer //仿函數,用模板實現 { template<typename T> void operator()(T *pstate) { pstate->print(); } }; */ int main() { std::vector<State*> vect; vect.push_back( new State(0) ); vect.push_back( new State(1) ); vect.push_back( new State(2) ); vect.push_back( new State(3) ); std::vector<State*>::iterator it( vect.begin() ); std::vector<State*>::iterator ite( vect.end() ); // for ( ; it != ite; ++it ) // { // (*it)->print(); // } // std::for_each(it,ite,&Print); //調用函數指針 std::for_each(it,ite,Printer()); //調用仿函數 system( "pause" ); return 0; }
改成仿函數後,執行報錯:提示error C2248: “Printer::operator ()”: 無法訪問 private 成員(在“Printer”類中聲明)
我以為是pstate->print(); 這裡提示不能訪問private成員m_state,後來一想,不可能啊,如果用全局函數的方式pstate->print()是可以運行的。肯定是仿函數有問題,後來網上查資料,終於知道原因了:
在類裡面默認的是private。必須顯示指定為public 。
解決方法:將仿函數加上public訪問屬性:
class Printer //改用仿函數 { public: //不能省略,不寫public,默認為private void operator()(State *pstate) { pstate->print(); } };
但是還有個疑問:為什麼State類中,可以不加public訪問屬性也能正確運行呢?後來一想,明白了,State不是一個類,而是一個結構體,默認的是public 。不必顯示指定為public 。不信,加上private,馬上報錯。