2015-05-06 157 views
1

我得到了下面的代碼:訪問受保護的成員[嵌套類]

class enclosing{ 
protected: 
    int var1 = 2; 
    int var2 = 4; 
public: 
    class problem{ 
    friend enclosing; 
    public: 
     void DoStuff(enclosing&e1){ 
      int Sum = e1.var1 + e1.var2; 
     } 
    }i1; 
}e1; 

我的問題是,如何訪問封裝類的保護成員變量? 這是否合法?

+0

相關:http://stackoverflow.com/questions/3058267/nested-class-member-function-cant-access-function-of-enclosing-class-why?rq = 1 – EdChum

+0

不,不是。您需要爲內部類提供要處理的封閉類的實例。 –

+0

所以我應該添加一個「朋友」? – DVSProductions

回答

0

你有友情倒退 - 一個班級不能宣佈自己是別人的朋友。

與Java的「內部類」不同,在類中定義的類不會自動訪問定義它的類的實例 - 「內部」類完全獨立,您需要將它傳遞給實例你希望它與之合作。

像這樣:

class enclosing 
{ 
protected: 
    int var1 = 2; 
    int var2 = 4; 
public: 
    friend class problem; 
    class problem 
    { 
    public: 
     void DoStuff(enclosing& e){ 
      int Sum = e.var1 + e.var2; 
     } 
    } i1; 
} e1; 

int main() 
{ 
    e1.i1.DoStuff(e1); 
    enclosing e2; 
    e2.i1.DoStuff(e1); // Also works 
    enclosing::problem x; 
    x.DoStuff(e2); // This, too. 
} 
+0

感謝您的詳細解釋 – DVSProductions

0

數據成員必須通過封閉類的對象來訪問。例如

void DoStuff(const enclosing &e){ 
      int Sum = e.var1 + e.var2; 
     } 
+0

謝謝你,你做了我的一天。最後尋找一小時後的好解決方案 – DVSProductions