首页 > 编程语言 > 详细

C++,关于类和结构体中,成员访问属性(public,private)

时间:2016-01-15 16:24:26      阅读:660      评论:0      收藏:0      [点我收藏+]

今天发现一个的问题:

#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,马上报错。

C++,关于类和结构体中,成员访问属性(public,private)

原文:http://www.cnblogs.com/VIPler/p/5133362.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!