Vnořené třídy prohlášení
Do působnosti jiné třídy lze deklarovat třídu.Tato třída se nazývá "vnořené třídy." Vnořené třídy jsou považovány za v působnosti ohraničující třídy a jsou k dispozici pro použití v daném oboru.Chcete-li vnořené třídy z oboru než bezprostřední ohraničující oblast jeho působnosti, musí použít plně kvalifikovaný název.
Následující příklad ukazuje, jak deklarovat vnořené třídy:
// nested_class_declarations.cpp
class BufferedIO
{
public:
enum IOError { None, Access, General };
// Declare nested class BufferedInput.
class BufferedInput
{
public:
int read();
int good()
{
return _inputerror == None;
}
private:
IOError _inputerror;
};
// Declare nested class BufferedOutput.
class BufferedOutput
{
// Member list
};
};
int main()
{
}
BufferedIO::BufferedInputa BufferedIO::BufferedOutput jsou deklarovány v BufferedIO.Tyto názvy tříd nejsou viditelné mimo oblast působnosti třídy BufferedIO.Však objekt typu BufferedIO neobsahuje žádné objekty typy BufferedInput nebo BufferedOutput.
Vnořené třídy přímo pomocí jména, názvy typu názvy statické členy a pouze z vnějšího třídy výčtu.Chcete-li použít názvy ostatních členů třídy, je nutné použít ukazatele, odkazy nebo názvy objektů.
V předchozím BufferedIO například výčet IOError lze přistupovat přímo pomocí funkce členů ve vnořené třídy BufferedIO::BufferedInput nebo BufferedIO::BufferedOutput, jak je uvedeno ve funkci good.
[!POZNÁMKA]
Vnořené třídy deklarovat pouze typy v rámci třídy oboru.Jsou to není příčina obsažené objekty vnořené třídy má být vytvořen.V předchozím příkladu deklaruje dvě vnořené třídy, ale není deklarovat všechny objekty tyto typy tříd.
Výjimku viditelnost oboru deklarace vnořené třídy je, pokud je název typu deklarován spolu s prohlášením vpřed.Název třídy deklarované dopředu prohlášení je v tomto případě viditelné mimo ohraničující třídy s jeho oblast působnosti definován nejmenší ohraničujícím oboru-class.Příklad:
// nested_class_declarations_2.cpp
class C
{
public:
typedef class U u_t; // class U visible outside class C scope
typedef class V {} v_t; // class V not visible outside class C
};
int main()
{
// okay, forward declaration used above so file scope is used
U* pu;
// error, type name only exists in class C scope
u_t* pu2; // C2065
// error, class defined above so class C scope
V* pv; // C2065
// okay, fully qualified name
C::V* pv2;
}