1. 程式人生 > >C++ nested class 巢狀類與外圍類 訪問問題

C++ nested class 巢狀類與外圍類 訪問問題

/*
巢狀類

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;
}