Udostępnij za pośrednictwem


Deklaracje klas zagnieżdżonych

Klasa może być zadeklarowana w zakresie innej klasy.Klasa taka nosi nazwę "zagnieżdżone klasy." Klas zagnieżdżonych uważane są za zakresem otaczający klasy i są dostępne do użycia w ramach tego zakresu.Aby odwołać się do klas zagnieżdżonych z zakresu innych niż jego natychmiastowego otaczający zakresu, należy użyć w pełni kwalifikowana nazwa.

Poniższy przykład przedstawia 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::BufferedInputi BufferedIO::BufferedOutput są zgłaszane w ramach BufferedIO.Nazwy klas nie są widoczne spoza zakresu klasy BufferedIO.Jednak obiekt typu BufferedIO nie zawiera żadnych obiektów typu BufferedInput lub BufferedOutput.

Klas zagnieżdżonych bezpośrednio można użyć nazwy, nazwy typu nazwy, elementy statyczne i moduły wyliczające tylko z otaczającym klasy.Aby użyć nazwy innych członków klasy, należy użyć wskaźników, odwołania lub nazwy obiektu.

W poprzednim BufferedIO przykład, wyliczania IOError możliwy jest bezpośrednio przez funkcje składowe klas zagnieżdżonych, BufferedIO::BufferedInput lub BufferedIO::BufferedOutput, jak pokazano w funkcji good.

[!UWAGA]

Klas zagnieżdżonych zadeklarować tylko typy zasięgu klasy.Jak nie Przyczyna zawarte obiekty zagnieżdżone klasy ma zostać utworzony.Poprzedni przykład oświadcza dwóch klas zagnieżdżonych, ale nie deklaruje wszelkie obiekty te typy klas.

Wyjątek widoczności zakres deklaracji klasy zagnieżdżonych jest, gdy nazwa typu jest zadeklarowany jako wraz z deklaracją do przodu.W takim przypadku nazwa klasy zadeklarowane przez deklarację do przodu jest widoczny spoza otaczający klasy z jej zakresu definiuje się najmniejsze otaczający zakres klasy korporacyjnej.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