內部類別可以存取私有變數嗎?
在此程式碼範例中,內部類別 Inner 是在外部類別 Outer 中定義的。當建立 Inner 的實例時,它應該能夠存取 Outer 類別的私有成員變數 var。但編譯時出現錯誤,提示 Inner 沒有名為 var 的成員。
內部類別和成員存取
C 中的內部類別被認為是友元其外部類別。作為友元,內部類別可以存取外部類別的所有成員,包括私有成員。因此,Inner 的實例應該能夠存取 Outer 的私有變數 var。
問題與解決方案
錯誤源於之間缺乏聯繫內部實例和外部實例。在Java中,內部類別與其封閉類別之間存在隱含的父子關係。但是,在 C 中,必須明確定義這種關係。
要解決此問題,必須將對外部類別的參考傳遞給內部類別的建構子。這為內部類別提供了存取外部類別成員所需的上下文。
以下是一個範例,示範如何建立父子連結並允許Inner 存取Outer 的私有變數var:
#include <string> #include <iostream> class Outer { public: class Inner { public: Inner(Outer& x): parent(x) {} // Pass a reference to the outer class void func() { std::string a = "myconst1"; std::cout << parent.var << std::endl; if (a == Outer::MYCONST) std::cout << "string same" << std::endl; else std::cout << "string not same" << std::endl; } private: Outer& parent; }; public: Outer(): i(*this), var(4) {} Outer(Outer& other): i(other), var(22) {} void func() { i.func(); } private: static const char* const MYCONST; Inner i; int var; }; const char* const Outer::MYCONST = "myconst"; int main() { Outer o1; Outer o2(o1); o1.func(); o2.func(); return 0; }
修改後的程式碼允許Inner 存取var,因為Inner 的建構子在Inner 和創建的Outer 實例之間建立了父子關係它。
以上是C 中的內部類別可以存取其外部類別的私有成員嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!