2015-09-18 11 views
5

Angenommen, ich habe eine Vorlagenklasse, die ich als Freundklasse deklarieren möchte. Soll ich die Klasse deklarieren oder ihr eine eigene Vorlage geben? Beide scheinen hier zu arbeiten, aber ich bin daran interessiert, wie ich das richtig mache.Vorlage Freund Klasse: Forward Declaration oder ...?

Beispiel:

template <typename E> 
class SLinkedList; 
template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList<E>; 
}; 

Oder

template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    template <typename T> 
    friend class SLinkedList; 
}; 

-

Für das, was ihren Wert, dieser Code von geändert wird, was aus einer Datenstrukturen und Algorithmen Lehrbuch direkt ist. Jedoch verwendet das Buch den folgenden Code, der den Fehler in Xcode „Explicit Spezialisierung von Nicht-Template-Klasse

template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList<E>; 
}; 

daher diese Frage‚SLinkedList‘gibt. Neu in C++.

Antwort

9

Ihre erste Ansatz ist wahrscheinlich das, was Sie wollen. Es SLinkedList<int> ein Freund von SNode<int> machen wird, und ähnlich für alle passenden Typen.

Ihre zweite Ansatz jeden SLinkedList ein Freund von jedem SNode machen. Dies ist wahrscheinlich nicht das, was Sie wollen, wie SLinkedList<Widget> kein Geschäft der Berührung hat privat e Teile eines SNode<int>


Ein anderer Ansatz, den ich empfehlen könnte, wäre SNode eine verschachtelte Klasse zu machen. Das ist ziemlich üblich, Datenstrukturen, bestehend aus Knoten:

template <typename E> 
class SLinkedList { 
    struct SNode { 
     E elem; 
     SNode* next; 
    }; 
}; 

Mit diesem Schema auch Sie loswerden der Freund Erklärung bekommen können und haben alles, was in SNode öffentlich, weil die ganze Klasse zu SLinkedList privat sein würde

+0

Interessanter Vorschlag. Prost – badfilms

Verwandte Themen