Compartilhar via


Modelos de classe aninhada

Modelos podem ser definidos em modelos de classe ou classes, caso em que eles são referidos como modelos de membro.Modelos de membro são classes são chamados de modelos de classe aninhada.Modelos de membro são funções são discutidos em Modelos de função de membro.

Modelos de classe aninhada são declarados como modelos de classe dentro do escopo da classe exterior.Eles podem ser definidos dentro ou fora da classe delimitador.

Exemplo

O código a seguir demonstra um modelo de classe aninhada dentro de uma classe comum.

// nested_class_template1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

class X
{

   template <class T>
   struct Y
   {
      T m_t;
      Y(T t): m_t(t) { }   
   };

   Y<int> yInt;
   Y<char> yChar;

public:
   X(int i, char c) : yInt(i), yChar(c) { }
   void print()
   {
      cout << yInt.m_t << " " << yChar.m_t << endl;
   }
};

int main()
{
   X x(1, 'a');
   x.print();
}

Quando os modelos de classe aninhada são definidos fora da sua classe delimitador, deve ser precedidas por parâmetros de modelo para o modelo de membro e os parâmetros de modelo para tanto o modelo de classe (se eles são membros de um modelo de classe).

// nested_class_template2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

template <class T>
class X
{
   template <class U> class Y
   {
      U* u;
   public:
      Y();
      U& Value();
      void print();
      ~Y();
   };

   Y<int> y;
public:
   X(T t) { y.Value() = t; }
   void print() { y.print(); }
};

template <class T> 
template <class U>
X<T>::Y<U>::Y()
{
   cout << "X<T>::Y<U>::Y()" << endl;
   u = new U();
}

template <class T> 
template <class U>
U& X<T>::Y<U>::Value()
{
   return *u;
}

template <class T> 
template <class U>
void X<T>::Y<U>::print()
{
   cout << this->Value() << endl;
}

template <class T> 
template <class U>
X<T>::Y<U>::~Y()
{
   cout << "X<T>::Y<U>::~Y()" << endl;
   delete u;
}

int main()
{
   X<int>* xi = new X<int>(10);
   X<char>* xc = new X<char>('c');
   xi->print();
   xc->print();
   delete xi;
   delete xc;
}

Saída

1 a

Saída

X<T>::Y<U>::Y()
X<T>::Y<U>::Y()
10
99
X<T>::Y<U>::~Y()
X<T>::Y<U>::~Y()

Classes de locais não são permitidos para que os modelos de membro.

Consulte também

Referência

Modelos de classe

Modelos de função de membro