程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++,關於類和結構體中,成員訪問屬性(public,private),publicprivate

C++,關於類和結構體中,成員訪問屬性(public,private),publicprivate

編輯:C++入門知識

C++,關於類和結構體中,成員訪問屬性(public,private),publicprivate


今天發現一個的問題:

#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,馬上報錯。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved