EDITAR - Respondió a continuación, perdió las llaves angulares. Gracias a todos.Plantillas C++ - LinkedList
He estado intentando escribir una lista rudimentaria individualmente enlazada, que puedo usar en otros programas. Deseo que sea capaz de trabajar con tipos integrados y definidos por el usuario, lo que significa que debe ser templado.
Debido a esto mi nodo también debe ser templado, ya que no sé la información que va a almacenar. He escrito una clase de nodo de la siguiente manera -
template <class T> class Node
{
T data; //the object information
Node* next; //pointer to the next node element
public:
//Methods omitted for brevity
};
Mi clase de lista enlazada se implementa en una clase independiente, y necesita crear una instancia de un nodo al añadir nuevos nodos al final de la lista. He implementado de la siguiente manera -
#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
};
He creado una clase de controlador/prueba de la siguiente -
#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;
}
consigo un error en la compilación sin embargo - error C2955: 'nodo': uso de la plantilla de clase requiere plantilla de lista de argumentos - que me apunta a la siguiente línea de código en mi método add -
Node* temp = new Node<T>;
no entiendo por qué º no tiene información sobre el tipo, ya que se pasó a la lista vinculada cuando se creó en mi clase de controlador. ¿Qué debería estar haciendo para pasar la información de tipo al nodo?
¿Debo crear una estructura de nodo privada en lugar de una clase separada, y combinar los métodos de ambas clases en un archivo? No estoy seguro de que esto supere el problema, pero creo que sí. Preferiría tener clases separadas si es posible.
Gracias, Andrew.
Gracias por la respuesta súper rápido todo. Tonto error de mi parte. Aclamaciones. –
¿Sabía que la biblioteca estándar de C++ ya proporciona una plantilla de lista doblemente enlazada (std :: list)? Además, la biblioteca de Boost proporciona listas vinculadas "intrusivas". –
Sí, lo sé, pero se supone que hacer las suyas es una buena práctica, especialmente para la lógica del puntero. Además, quiero implementar algunos de los métodos de forma un poco diferente. Gracias por el consejo sin embargo. –