Udostępnij za pośrednictwem


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

Zobacz też

Informacje

Klasy, struktury i związki