cómo vincular dos clases de plantilla en muchos-a-muchos de amistad?
-
27-10-2019 - |
Pregunta
supongamos que tengo los siguientes dos clases de plantilla :
template <class _A>
class First
{
private:
int a;
};
template <class _B>
class Second
{
private:
int b;
};
¿cómo puedo vincular en muchos-a-muchos de amistad.por ejemplo, la adición de un método en Primer lugar que imprime b de un objeto de parámetro de Segundo.
mi pregunta es clara?
Solución
template <typename T>
class First {
int a;
template<typename> friend class Second;
};
template <typename T>
class Second
{
int b;
template<typename> friend class First;
};
Esto permitirá que cada First<T>
para acceder a los componentes internos de cada Second<U>
.Ahora, si bien esta es la solución técnica, usted querrá considerar si un diseño con cíclico de las dependencias y la apertura de los internos a cualquier instancia de la otra clase es la mejor solución para su problema en particular.
Por CIERTO, si usted sólo desea conceder First<int>
el acceso a Second<int>
(y no Second<double>
) puede hacer que así:
template <typename> class Second;
template <typename T>
class First {
int a;
friend class Second<T>; // only befriend the same instantiation
};
template <typename T>
class Second {
int b;
friend class First<T>;
};
En esta segunda versión que necesita el avance de la declaración de la Second
plantilla antes de hacerse amigos de un particular, la creación de instancias, pero esto permite conceder acceso a los componentes internos de la clase sólo a un particular la creación de instancias.
Otros consejos
Suponiendo que comprenda la protección, el problema es la declaración de plantillas:
#include <iostream>
template <class _B> class Second; // Forward declare
template <class _A>
class First
{
public:
template<class _B>
void print(const Second<_B>& b)
{
std::cout << b.b << std::endl;
}
int a;
};
template <class _B>
class Second
{
public:
int b;
};
void testIt()
{
Second<double> sd;
First<int >fi;
fi.print<double>(sd);
}
Podría comenzar con una declaración de cada clase:
template< typename T > class First;
template< typename T > class Second;
Y ahora ambas clases conocerán la otra en sus definiciones.Puede declararlos como amigos allí si es necesario.
template< typename T > class First
{
template< typename U> friend class Second;
};
y lo mismo a la inversa.
También puede implementar cuerpos de función bajo las definiciones de clase si necesitan ver los detalles de los demás, es decir, no pueden usar una copia de "declaración de reenvío".