pop70 a répondu à ta question mais j'aimerais soulever quelques maladresse de code:
Ce n'est pas standard et n'a rien à faire ton code (c'est un pseudo-remplaçant de la guarde que tu as de toute façon écrite).
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#ifndef _LIST_
#define _LIST_
Les "includes" devraient être à l'intérieur de la garde et pas au dessus. (Donc les "includes" en dessous du ifndef/define)
Évite les "using namespace", voir:
[ Lien ]
En C++, une structure et une classe, c'est la même chose. Donc "cell" devrait avoir une majuscule, et le "public" est inutile, puisqu'une struct est déjà publique par défaut.
De même, généralement un nom de méthode commence par une lettre minuscule.
Devrait être List(). En C++, une fonction qui ne prend pas d'argument s'écrit comme cela. Il n'y a qu'en C où l'on est obligé de mettre "void".
int size;
cell<T>* first;
cell<T>* last;
On met généralement un différenciateur sur les attributs de classe. Par exemple "first" devrait être "_first".
Les "this->" sont inutiles, et il est d'usage de ne pas les mettre.
this->first=NULL;
this->last=NULL;
Évite les NULL, voir:
0217021.free.fr/portfolio/axel.berardino/articles/null-en-cpp. Préfère 0 (ou "nullptr" si tu es en C++0x).
Liste(void)
{
this->first=NULL;
this->last=NULL;
this->size=0;
}
Utilise la liste d'initialisation dès que tu le peux ! Devrait être:
Code C/C++ :
Liste()
: _first(0), _last(0), _size(0)
{
}
Pas besoin de parenthèse, "delete" est un mot clé et non une fonction. => delete _first;
Le virtual est inutile ici. Tu peux le retirer. => ~Liste()
if (pos > this->size)
{
return NULL;
}
else
{
// code
}
Le "return" est débranchant. Donc il est inutile de mettre un "else". Pas besoin non plus de crochets lorsque tu as une seule instruction.
Code C/C++ :
if (pos > this->size)
return NULL;
// code
(À corriger partout)
Enfin pour la fonction d'affichage, il est d'usage de ne pas utiliser de friend (ni de cast d'ailleurs). On réalise généralement une fonction publique "print" qui prend un std::ostream en argument. Puis on appelle cette fonction dans la fonction de "sucrement".
Ça permet de laisser la logique au sein de la classe, et de laisser le rôle de sucrement à la fonction de sucrement.
Ex:
Dans ta classe:
Code C/C++ :
void print(std::ostream& out)
{
if (list->ElementAt(0) != 0)
{
const cell<T> *temp = list->GetFirst();
for (int i = 0; i < list->GetSize(); ++i)
{
out << temp->data << " - " ;
temp = temp->next;
}
}
}
En dehors:
Code C/C++ :
std::ostream& operator <<(std::ostream& out, const Liste<T>& list)
{
list.print(out);
return out;
}
Ce qui au passage, ne nécessite pas de friend.
Au niveau de ton main:
Pas besoin de faire des new (surtout que tu oublies les delete qui vont avec !).
Tu peux directement remplacer: "Liste<int>* list = new Liste<int>();" par "Liste<int> list;" (et donc toutes les "->" deviennent des ".").
Les includes du C n'ont rien à faire là (donc retire les stdio.h et stdlib.h). Si tu veux mettre une pause, un "std::cin.get()" remplacera avantageusement ton scanf.
Enfin, sépare la déclaration et le code. Il ne devrait pas y avoir de code dans un header.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question