Zagnieżdżone deklaracje klas
Klasa może być zadeklarowana w zakresie innej klasy.Taka klasa nosi nazwę "klasy zagnieżdżonej." Klasy zagnieżdżone są rozważane w zakresie otaczającej klasy i są dostępne do użycia w tym zakresie.Aby odwołać się do klasy zagnieżdżonej z zakresu innego niż jego bezpośredni zasięg, należy użyć w pełni kwalifikowanej nazwy.
Poniższy przykład pokazuje sposób deklarowania klas zagnieżdżonych:
// 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 i BufferedIO::BufferedOutput są zadeklarowane w ramach BufferedIO.Nazwy klas nie są widoczne w zakresie klasy BufferedIO.Jednak obiekt typu BufferedIO nie zawiera żadnych obiektów typu BufferedInput lub BufferedOutput.
Klasy zagnieżdżone mogą bezpośrednio korzystać z nazw, nazwy typów, nazw statycznych elementów członkowskich i wyliczeń tylko z otaczającej klasy.Aby używać nazw innych elementów członkowskich klasy, należy użyć wskaźników, odwołań lub nazw obiektów.
W poprzednim przykładzie BufferedIO, wyliczenie IOError jest dostępne bezpośrednio przez funkcje członkowskie w klasach zagnieżdżonych BufferedIO::BufferedInput lub BufferedIO::BufferedOutput, jak pokazano w funkcji good.
[!UWAGA]
Klasy zagnieżdżone deklarują tylko typy w zakresie klasy.Nie przyczyniają się do tworzenia obiektów, w których zagnieżdżone są klasy.Poprzedni przykład deklaruje dwie klasy zagnieżdżone, ale nie deklaruje żadnych obiektów tego typu klas.
Wyjątkiem zakresu widoczności deklaracji klasy zagnieżdżonej jest nazwa typu zadeklarowana wraz z deklaracją do przodu. W tym przypadku nazwa klasy zadeklarowanej deklaracji do przodu jest widoczna spoza otaczający klasy z jej zakresem zdefiniowanym jako najmniejszy otaczający zakres. Na przykład:
// 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;
}