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?

¿Fue útil?

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".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top