Vnořené deklarace tříd
Třída může být deklarována v rámci jiné třídy.Tato třída se nazývá "vnořená třída". Vnořené třídy jsou považovány za součást rozsahu ohraničující třídy a jsou k dispozici pro použití v daném oboru.Pro odkazování na vnořenou třídu z jiného oboru, než její ohraničující obor, je třeba 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::BufferedInput a BufferedIO::BufferedOutput jsou deklarovány v BufferedIO.Tyto názvy tříd nejsou viditelné mimo obor třídy BufferedIO.Objekt typu BufferedIO však neobsahuje žádné objekty typu BufferedInput nebo BufferedOutput.
Vnořené třídy mohou přímo použít názvy, názvy typu, názvy statických členů a enumerátory pouze z nadřazené třídy.Pro použití názvů ostatních členů třídy je nutné použít odkazy nebo názvy objektů.
V předchozím příkladu BufferedIO lze k enumerátoru IOError přistupovat přímo pomocí členské funkce vnořených tříd BufferedIO::BufferedInput nebo BufferedIO::BufferedOutput, jak je uvedeno ve funkci good.
[!POZNÁMKA]
Vnořené třídy deklarují pouze typy v rámci oboru třídy.Nezpůsobují vytvoření obsažených objektů vnořené třídy.Předchozí příklad deklaruje dvě vnořené třídy, ale nedeklaruje žádné objekty těchto typů tříd.
Výjimka deklarace viditelnosti oboru se objeví, je-li název typu deklarován spolu s dopřednou deklarací. Název třídy, která je deklarována dopřednou deklarací, je v tomto případě viditelný mimo ohraničující třídu, kde je její obor působnosti nejmenším ohraničujícím netřídním oborem. 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;
}