Udostępnij za pośrednictwem


Zagnieżdżone nazwy typów

Microsoft C++ obsługuje deklaracje typów zagnieżdżonych — nazwanych i anonimowych. Klasy i struktury anonimowe są specyficznym dla firmy Microsoft rozszerzeniem języka C++. Związki anonimowe są standardowe.

[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id

Uwagi

Nazwa pierwszej klasy powyżej odnosi się do klasy zewnętrznej; druga odnosi się do klasy wewnętrznej. Nazwy te mogą być dalej zagnieżdżane.Tak więc,

Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2

są prawidłowymi nazwami klas. Zamiast nazw klas, można użyć identyfikatorów szablonu, z opcjonalnym słowem kluczowym template, jak w

MyClass<int>::Inner
Outer<int>::template Inner<int>

W niektórych sytuacjach w programowaniu, warto zdefiniować typy zagnieżdżone.Typy te są widoczne tylko dla funkcji członkowskich typu klasy, w której są zdefiniowane.Mogą być również uwidocznione przez utworzenie kwalifikowanej nazwy typu za pomocą operatora rozpoznawania zakresu (::).

[!UWAGA]

Iostream jest jedną z często używanych hierarchii klas, która używa typów zagnieżdżonych.W plikach nagłówkowych iostream, definicja klasy ios zawiera serię typów wyliczeniowych, które są pakowane do użytku tylko z biblioteką iostream.

Przykład

W poniższym przykładzie zdefiniowano klasy zagnieżdżone:

// nested_type_names1.cpp
class WinSystem
{
public:
   class Window
   {
   public:
      Window();   // Default constructor.
      ~Window();   // Destructor.
      int NumberOf();   // Number of objects of class.        
      int Count();   // Count number of objects of class.
   private:
      static int CCount;
   };

   class CommPort
   {
   public:
      CommPort();   // Default constructor.
      ~CommPort();   // Destructor.
      int NumberOf();   // Number of objects of class.
      int Count();   // Count number of objects of class.
   private:
      static int CCount;
   };
};

// Initialize WinSystem static members.
int WinSystem::Window::CCount = 0;
int WinSystem::CommPort::CCount = 0;

int main()
{
}

Aby uzyskać dostęp do nazwy zdefiniowanej w klasie zagnieżdżonej, należy użyć operatora rozpoznawania zakresu (::), aby skonstruować kompletną nazwę klasy.Sposób użycia tego operatora został pokazany w inicjacji statycznych elementów członkowskich w poprzednim przykładzie.Aby użyć klasy zagnieżdżonej w programie, należy użyć kodu takiego jak:

WinSystem::Window Desktop;
WinSystem::Window AppWindow;

cout << "Number of active windows: " << Desktop.Count() << "\n";

Zagnieżdżone struktury lub klasy anonimowe można zdefiniować jako:

// nested_type_names2.cpp
class Ledger
{
   class
   {
   public:
      double PayableAmt;
      unsigned PayableDays;
   } Payables;

   class
   {
   public:
      double RecvableAmt;
      unsigned RecvableDays;
   } Receivables;
};

int main()
{
}

Klasa anonimowa musi być agregacją, która nie ma funkcji członkowskich ani elementów statycznych.

KONIEC informacji specyficznych dla firmy Microsoft

[!UWAGA]

Chociaż można zdefiniować typ wyliczeniowy wewnątrz deklaracji klasy, nie można zrobić na odwrót; nie można zdefiniować typów klas wewnątrz deklaracji wyliczenia.

Zobacz też

Informacje

Specyfikatory typu C++