2015-11-05 54 views
0

我不確定我的問題是否正確?但讓我仍然試着問一次。不允許直接在同一類中訪問成員變量

我有一個類,有幾個成員變量定義。按照面向對象的概念,每個成員函數都可以訪問它的類的所有成員變量。

但我希望這些成員變量可以通過特定的方法訪問(讓我們說Getters),即使在相同的類成員函數中。

有沒有辦法做到這一點?

class A { 

public: 

void func1(); 
void func2(); 
B getB(); 

private: 
B b; 
} 

void A::func1() { 

b.functionFromB(); // function uses member variable b directly 
} 

void A::func2() { 
B b1=getB(); // function ask for B from a function and then uses it. // I need something like this... And ensure each function uses same way otherwise there should be warning... 
b1.functionFromB(); 
} 

感謝, 凱拉斯

+2

不是直接的,但你可以添加一個額外的圖層。 – Jarod42

+2

我只能想到一種方法來實現這一點,它將這些變量放入嵌套類 – Marco

+0

這聽起來更像是通過公共成員函數(setter/getters)訪問私人成員 – Pandrei

回答

2

沒有,沒有。 ,而不是由類的用戶

class shape 
{ 
    private: 
     int angles; 
    protected: 
     shape(int angles_):angles(angles_){}; 
     int getAngles() const; 
} 

class square : private shape 
{ 
    public: 
     square():shape(4){} 
     void doSth() 
     { 
      \\ you can access angles only via getAngles(); 
     }  
} 
1

類的任何私有成員可以從類中訪問:您可以通過封裝和繼承喜歡這樣做。所以它看起來像你需要私人成員和允許訪問它們的公共方法。

class A 
{ 
    private: 
     int a; 
    public: 
     int getA() {return a;} 

}; 

int main() 
{ 
    A inst; 
    int t; 

    inst.a =5; // error member a is private 
    t = inst.getA(); //OK 
} 

概念延伸罰款的情況下,嵌套類的聲明只希望允許從其它類創建一個類的實例;細節here

+0

我認爲這是一個很好的例子,可以證明OOP的優勢。+ 1 – aGer

+0

這不是他或他正在尋找的東西。 – emlai

+0

是的..我不是在尋找這個..我想限制直接訪問變量/ atleast警告直接訪問來自同一類的方法的變量。我認爲沒有其他選擇比在這裏使用繼承.. – Kailas

0

正如其他人所說 - 你必須添加一個額外的層。

如果您想要訪問特定的方法,那麼您可以使用friend關鍵字。例如。

// Public.h 
#pragma once 

class Public 
{ 
public: 
    Public(); 

    int GetI() const; 
    float GetF() const; 

private: 
    std::unique_ptr<Private> p_; 
}; 

//Public.cpp 
#include "Public.h" 

Public::Public() 
    : p_(new Private) 
{ 
} 

int Public::GetI() const 
{ 
    return p_->i_; 
} 

float Public::GetF() const 
{ 
    return p_->f_; 
} 

// Private.h 
#pragma once 

class Private 
{ 
    friend int Public::GetI() const; 
    friend float Public::GetF() const; 

    int i_; 
    float f_; 
}; 

請記住,每個朋友方法都可以訪問所有私人成員。

如果你真的想限制哪些方法可以訪問哪些成員,那麼你可以將每個成員包裝在一個單獨的類/結構中,並且僅使該成員的getter/setter成爲該類/ struct的一個朋友,但是我不會推薦這種方法。

相關問題