#include "stdafx.h"
/*
c++嵌套類
可以在另一個類內部定義一個類,這樣的類嵌套類(nested class)
嵌套類是獨立的類,基本上與它們外圍類不相關,因此,外圍類和嵌套類的對象是互相獨立的。
嵌套類型的對象不具備外圍類所定義的成員,同樣,外圍類的成員也不具備嵌套類所定義的成員。
在一個類的內部定義另一個類,我們稱之為嵌套類(nested class),或者嵌套類型。之所以引入這樣一個嵌套類,往往是因為外圍類需要使用嵌套類對象作為底層實現,并且該嵌套類只用于外圍類的實現,且同時可以對用戶隱藏該底層實現。
雖然嵌套類在外圍類內部定義,但它是一個獨立的類,基本上與外圍類不相關。它的成員不屬于外圍類,同樣,外圍類的成員也不屬于該嵌套類。嵌套類的出現只是告訴外圍類有一個這樣的類型成員供外圍類使用。并且,外圍類對嵌套類成員的訪問沒有任何特權,嵌套類對外圍類成員的訪問也同樣如此,它們都遵循普通類所具有的標號訪問控制。
若不在嵌套類內部定義其成員,則其定義只能寫到與外圍類相同的作用域中,且要用外圍類進行限定,不能把定義寫在外圍類中。例如,嵌套類的靜態成員就是這樣的一個例子。
前面說過,之所以使用嵌套類的另一個原因是達到底層實現隱藏的目的。為了實現這種目的,我們需要在另一個頭文件中定義該嵌套類,而只在外圍類中前向聲明這個嵌套類即可。當然,在外圍類外面定義這個嵌套類時,應該使用外圍類進行限定。使用時,只需要在外圍類的實現文件中包含這個頭文件即可。
另外,嵌套類可以直接引用外圍類的靜態成員、類型名和枚舉成員(假定這些成員是公有的)。類型名是一個typedef名字、枚舉類型名、或是一個類名。
在嵌套類的定義被看到之前我們只能聲明嵌套類的指針和引用,如上面在A中定義為B m_b而不是B* m_b將會引發一個編譯錯誤。
關于C++嵌套類的詳細用法請參考《C++ Primer 第三版》P551。
*/
//outerB.h
//外圍類outerB
class outerB
{
public:
outerB();
~outerB();
void show();
//嵌套類 innerA
class innerA
{
public:
innerA();
~innerA();
void _show();
};
private:
innerA* m_p_innerA;
};
//outerB.cpp
outerB::outerB():m_p_innerA(new innerA)
{
printf("%s \r\n",__FUNCTION__);
}
outerB::~outerB()
{
printf("%s \r\n",__FUNCTION__);
if (m_p_innerA!=NULL)
{
delete m_p_innerA;
}
}
void outerB::show()
{
m_p_innerA->_show();
printf("%s \r\n",__FUNCTION__);
}
outerB::innerA::innerA()
{
printf("%s \r\n",__FUNCTION__);
}
outerB::innerA::~innerA()
{
printf("%s \r\n",__FUNCTION__);
}
void outerB::innerA::_show()
{
printf("%s \r\n",__FUNCTION__);
}
int _tmain(int argc, _TCHAR* argv[])
{
outerB x;
x.show();
return 0;
}
//輸出
/*
outerB::innerA::innerA
outerB::outerB
outerB::innerA::_show
outerB::show
outerB::~outerB
outerB::innerA::~innerA
*/