Partilhar via


Nomes de tipo aninhados

O Microsoft C++ suporta a declaração de tipos aninhados (nomeados e anônimos). As estruturas anônimas e as classes são uma extensão específica da Microsoft para o C++. As uniões anônimas são padrão.

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

Comentários

O primeiro class-name acima refere-se à classe externa; o segundo refere-se à classe interna. Esses nomes podem ser ainda mais aninhados. Assim,

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

todos são nomes de classes válidos. No lugar de nomes de classe, os identificadores de modelo podem ser usados, com a palavra-chave opcional do modelo, como em

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

Em algumas situações de programação, convém definir tipos aninhados. Esses tipos podem ser vistos somente por funções de membro do tipo de classe em que eles estão definidos. Eles também podem se tornar visíveis construindo um nome de tipo qualificado usando o operador de resolução de escopo (::).

Dica

Uma hierarquia de classe comumente usada que utiliza tipos aninhados é a iostream.Nos arquivos de cabeçalho iostream, a definição da classe ios inclui uma série de tipos enumerados, que são compactados para uso somente com a biblioteca iostream.

Exemplo

O exemplo a seguir define classes aninhadas:

// 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()
{
}

Para acessar um nome definido em uma classe aninhada, use o operador de resolução de escopo (::) para construir um nome de classe completo. O uso desse operador é mostrado nas inicializações dos membros static no exemplo anterior. Para usar uma classe aninhada em seu programa, use códigos como:

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

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

As classes ou estruturas aninhadas anônimas podem ser definidas como:

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

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

int main()
{
}

Uma classe anônima deve ser uma agregada que não tem nenhuma função de membro e nenhum membro estático.

FIM de específico da Microsoft

Dica

Embora um tipo enumerado possa ser definido dentro de uma declaração de classe, o contrário não é verdadeiro. Os tipos de classe não podem ser definidos dentro das declarações de enumeração.

Consulte também

Referência

Especificadores de tipo C++