Les Modèles C++ - LinkedList
EDITION-réponse ci-dessous, a raté l'angle des accolades. Merci à tous.
J'ai été de tenter d'écrire un rudimentaire seule liste liée, que je puisse utiliser dans d'autres programmes. Je veux être en mesure de travailler avec les intégrés et les types définis par l'utilisateur, le sens qu'il doit être basé sur un modèle.
Pour cette raison mon nœud doit également être basé sur un modèle, que je ne connais pas l'information qu'il va stocker. J'ai écrit une classe de nœud comme suit -
template <class T> class Node
{
T data; //the object information
Node* next; //pointer to the next node element
public:
//Methods omitted for brevity
};
Ma liste liée classe est mis en œuvre dans une salle de classe, et doit instancier un nœud lors de l'ajout de nouveaux nœuds à la fin de la liste. J'ai mis en œuvre comme suit -
#include <iostream>
#include "Node.h"
using namespace std;
template <class T> class CustomLinkedList
{
Node<T> *head, *tail;
public:
CustomLinkedList()
{
head = NULL;
tail = NULL;
}
~CustomLinkedList()
{
}
//Method adds info to the end of the list
void add(T info)
{
if(head == NULL) //if our list is currently empty
{
head = new Node<T>; //Create new node of type T
head->setData(info);
tail = head;
}
else //if not empty add to the end and move the tail
{
Node* temp = new Node<T>;
temp->setData(info);
temp->setNextNull();
tail->setNext(temp);
tail = tail->getNext();
}
}
//print method omitted
};
J'ai mis en place un pilote/de la classe de test comme suit -
#include "CustomLinkedList.h"
using namespace std;
int main()
{
CustomLinkedList<int> firstList;
firstList.add(32);
firstList.printlist();
//Pause the program until input is received
int i;
cin >> i;
return 0;
}
J'obtiens une erreur lors de la compilation toutefois - erreur C2955: "Nœud": utilisation de la classe de modèle de modèle de liste d'arguments - des points qui m'a à la ligne suivante de code dans la méthode add -
Node* temp = new Node<T>;
Je ne comprends pas pourquoi cela n'a aucune information sur le type, depuis qu'il a été transmis à la liste lors de la création dans ma classe pilote. Que dois-je faire pour transmettre les informations de type de Nœud?
Dois-je créer un privé struct nœud au lieu d'une salle de classe, et de combiner les méthodes de ces deux classes dans un même fichier? Je ne suis pas certain cela permettrait de résoudre le problème, mais je pense qu'il pourrait. J'aurais préféré séparer les classes, si possible.
Merci, Andrew.
Saviez-vous que le C++ de la bibliothèque standard fournit déjà une double liaison dans le modèle de liste (std::list)? Aussi, la bibliothèque Boost fournit "intrusif" les listes chaînées.
Oui, je sais, mais de faire votre propre est censé être une bonne pratique, en particulier pour le pointeur de la logique. En Plus je veux mettre en œuvre certaines des méthodes un peu différemment. Merci pour les conseils.
OriginalL'auteur Drew_StackID | 2010-01-16
Vous devez vous connecter pour publier un commentaire.
Pourriez veux essayer
Aussi, pour obtenir des conseils sur la façon de concevoir la liste, vous pouvez bien sûr regarder std::list, mais il peut être un peu intimidant à la fois.
OriginalL'auteur villintehaspam
Alors que les réponses ont déjà été fournis, je pense que je vais ajouter mon grain de sel.
Lors de la conception de modèles de classe, c'est une bonne idée de ne pas répéter les arguments de modèle à peu près partout, juste au cas où vous le souhaitez (un jour) de changer un détail particulier. En général, cela est fait en utilisant des typedefs.
C'est aussi pour mieux définir les méthodes en dehors de la déclaration de la classe, fait qu'il est plus facile de lire l'interface.
Maintenant, quelques remarques:
List<T>::add
revenait un itérateur pour les nouveaux objets, comme lesinsert
méthodes ne dans la STL (et vous pouvez la renommer insérer trop)List<T>::add
vous affecter la mémoire àtemp
puis effectuer un tas d'opérations, le cas échéant jette, vous avez une fuite de mémoiresetNextNull
appel ne devrait pas être nécessaire: le constructeur deNode
devez initialiser toutes les données membres de significatif des valeurs, inclusm_next
Voici donc une version révisée:
Remarque comment le simple fait d'utiliser un bon constructeur améliore notre exception de sécurité: si jamais rien jeter pendant le constructeur,
new
est nécessaire de ne pas allouer de la mémoire, donc rien n'est coulé et nous n'avons effectué aucune opération encore. NotreList<T>::insert
méthode est maintenant résistant.Dernière question:
D'habitude
insert
méthodes de simples listes liées insérer au début, parce que c'est plus facile:Êtes-vous sûr que vous voulez aller avec un insert à la fin ? ou avez-vous le faire de cette façon en raison de la
push_back
méthode traditionnelle des vecteurs et des listes ?OriginalL'auteur Matthieu M.
Cette ligne devrait lire
De même pour le
next
pointeur dans la classe de Nœud.OriginalL'auteur sepp2k
Comme l'a dit, la solution est
... parce que
Node
lui-même n'est pas un type,Node<T>
est.OriginalL'auteur Kornel Kisielewicz
Vous avez besoin:
Pourrait être utile à un
typedef NodeType = Node<T>
dans leCustomLinkedList
classe pour éviter ce problème de surgir à nouveau.OriginalL'auteur P-Nuts
Et vous aurez besoin de spécifier le paramètre de modèle pour le Nœud *temp en printlist aussi.
OriginalL'auteur UnknownGuy
OriginalL'auteur thecharliex
Vous Devez ajouter un nouveau nœud de cette façon
Espère que vous avez Résolu 🙂
OriginalL'auteur user4350912
OriginalL'auteur Narendra kumawat