Nomes de tipo aninhado
Microsoft C++ oferece suporte a declaração de tipos aninhados — ambos os anônimos e nomeado.Classes e structs anônimos são uma extensão específica do Microsoft C++.Uniões anônimos 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 nome da primeira classe acima refere-se para a classe externa; o segundo refere-se a classe interna.Esses nomes podem ser aninhados ainda mais.Assim,
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
são os nomes válidos de classes.Em vez de nomes de classe, os identificadores de modelo podem ser usados, com a palavra-chave do modelo opcional, como em
MyClass<int>::Inner
Outer<int>::template Inner<int>
Em algumas situações de programação, faz sentido definir tipos aninhados.Esses tipos são visíveis apenas para as funções de membro do tipo de classe em que eles são definidos.Eles também podem ser feitos visíveis, criando um nome de tipo qualificado usando o operador de escopo de resolução (:).
Observação |
---|
Uma hierarquia de classes comumente usados que emprega tipos aninhados é iostream.Nos arquivos de cabeçalho iostream, a definição da classe ios inclui uma série de tipos enumerados, que são empacotados 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 escopo de resolução (:) para construir um nome de classe completa.O uso deste operador é mostrado nas inicializações da estático membros no exemplo anterior.Para usar uma classe aninhada em seu programa, use o código como:
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
Classes aninhadas de anônimos ou estruturas 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 agregação que possui nenhuma função de membro e não há membros estáticos.
END Microsoft específico
Observação |
---|
Embora um tipo enumerado pode ser definido dentro de uma declaração de classe, o inverso não é verdadeiro; tipos de classe não podem ser definidos dentro de declarações de enumeração. |