今天發現一個的問題:
#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,馬上報錯。