Frage

gehe davon aus, dass ich die folgenden zwei Vorlagenklassen habe:

template <class _A>
class First
{
private:
    int a;
};

template <class _B>
class Second
{
private:
    int b;
};

Wie kann ich sie in einer Freundschaft von vielen zu vielen verbinden?Beispiel: Hinzufügen einer Methode in First, die b eines Parameterobjekts von Second ausgibt.

ist meine Frage klar?

War es hilfreich?

Lösung

template <typename T>
class First {
   int a;
   template<typename> friend class Second;
};
template <typename T>
class Second
{
   int b;
   template<typename> friend class First;
};

Dadurch kann jeder First<T> auf die Interna jedes Second<U>s zugreifen.Obwohl dies die technische Lösung ist, sollten Sie überlegen, ob ein Entwurf mit zyklischen Abhängigkeiten und die Öffnung des internen für eine Instanziierung der anderen Klasse die beste Lösung für Ihr spezielles Problem ist.

Übrigens, wenn Sie nur First<int> Zugriff auf Second<int> (und nicht Second<double>) gewähren möchten, können Sie dies folgendermaßen tun:

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>;
};

In dieser zweiten Version benötigen Sie die Vorwärtsdeklaration der Second-Vorlage, bevor Sie sich mit einer bestimmten Instanziierung anfreunden können. Auf diese Weise können Sie jedoch nur einer bestimmten Instanziierung Zugriff auf die Interna der Klasse gewähren.

Andere Tipps

Vorausgesetzt, Sie verstehen den Schutz, ist das Problem die Vorwärtsdeklaration von Vorlagen:

#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);
}

Sie können mit einer Deklaration jeder Klasse beginnen:

template< typename T > class First;
template< typename T > class Second;

Und jetzt kennen beide Klassen den anderen in ihren Definitionen.Sie können sie dort bei Bedarf als Freunde deklarieren.

template< typename T > class First
{
   template< typename U> friend class Second;
};

und umgekehrt.

Sie können auch Funktionskörper unter den Klassendefinitionen implementieren, wenn sie die Details des anderen sehen müssen, d. h. sie können keine Kopie der "Vorwärtsdeklaration" verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top