C++ nested class 巢狀類與外圍類 訪問問題
阿新 • • 發佈:2018-12-26
/* 巢狀類 nested class 巢狀類的引入是為了更好的名稱空間使用。 巢狀類是名字在其外圍類的作用域中可見,但在其他類作用域或定義外圍類的作用域中不可見。 巢狀類的名字將不會與另一作用域中宣告的名字衝突。 但巢狀類是獨立的類,基本上與他們的外圍類不相關,因此外圍類和巢狀類的“物件”是互相獨立的。 巢狀型別的物件不具備外圍類所定義的成員,同樣,外圍類的成員也不具備巢狀類所定義的成員。 區別:類宣告、定義 與 類物件訪問成員的區別。 本例題來源於: Morgan Stanley 實習生招聘 Online Test (C++) */ #include <iostream> using namespace std; class Outer { public: static int m_Out; void outDisplay(); class Inner { public: static int m_In; void inDisplay(); }; }; int Outer::m_Out=10; int Outer::Inner::m_In=25; void Outer::outDisplay() { std::cout<<m_Out<<std::endl; // // std::cout<<m_In<<std::endl; // error, m_In is invisible std::cout<<Inner::m_In<<std::endl; // } void Outer::Inner::inDisplay() { std::cout<<m_Out<<std::endl; // m_Out在內部類中查詢不到,去外部類作用域中查詢 std::cout<<m_In<<std::endl; // } int main() { Outer objOut; Outer::Inner objIn; objIn.inDisplay(); //objIn.m_Out; //error, access is forbidden //objIn.Outer::m_Out; //error, access is forbidden objOut.m_Out; objOut.outDisplay(); //objOut.m_In; // error,cannot pass compiling //objOut.Inner::m_In; //error, access is forbidden ,cannot pass compiling return 0; }