今天发现一个的问题:
#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( ) ); vect.push_back( ) ); vect.push_back( ) ); vect.push_back( ) ); 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" ); ; }
改成仿函数后,执行报错:提示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,马上报错。