Utiliser une surcharge d'operateur dans une autre classe du projet ?
Bonjour à tous :),
Mon programme est assez simple, je crée des objets 'Livre' que j'insère dans un objet 'VecteurTrie', dans lequel j'essaye de les trier par nom, puis par auteurs, pour ensuite les afficher.
Voici mon code :
surcharge des operateurs de comparaison dans Livre.cpp:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| int Livre::compare(Livre l)
{
if(strcmp(titre,l.titre) < 0) return -1;
else if(strcmp(titre,l.titre) > 0) return 1;
else
{
for(int i=0; i<MAX; i++)
{
if(strcmp((auteurs[i]->Nom),(l.auteurs[i]->Nom))== -1) return -1;
if(strcmp((auteurs[i]->Nom),(l.auteurs[i]->Nom))== 1) return 1;
}
return 0; // si titre et auteurs identiques
}
}
int Livre::operator<(const Livre& l)
{
return compare(l)== -1;
}
int Livre::operator==(const Livre& l)
{
return compare(l)== 0;
}
int Livre::operator>(const Livre& l)
{
return compare(l)== 1;
} |
Ma classe VecteurTrie.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
template <class type> VecteurTrie<type>::VecteurTrie()
{
tab = new type[10];
pTop = tab;
nbrElem=0;
}
template <class type> VecteurTrie<type>::VecteurTrie(int ne)
{
if(ne < 11)
{
nbrElem = ne;
}
else{ nbrElem = 10; }
tab = new type[nbrElem];
pTop=tab;
}
template <class type> VecteurTrie<type>::VecteurTrie(const VecteurTrie<type> &v)
{
nbrElem=v.nbrElem;
tab=new type[nbrElem];
tab=v.tab;
pTop=v.pTop;
}
// fonction membre
template <class type> void VecteurTrie<type>::insert(type a)
{
if(nbrElem < 10)
{
*pTop = a;
pTop++;
int mmin;
type temp;
// le tri ne fonctionne pas avec les objets livres...
for (int i=0; i<nbrElem-1; i++)
{
mmin = i;
for (int j=i+1; j<nbrElem; j++)
{
if (tab[j] < tab[mmin])
{
mmin = j;
}
if (mmin != i)
{
temp = tab[i];
tab[i] = tab[mmin];
tab[mmin] = temp;
}
}
}
}
else{ throw VectorFullException("Erreur: Le vecteur est plein."); }
}
template <class type> void VecteurTrie<type>::removeElem(type a)
{
if(nbrElem > 0)
{
int cpt = 0;
for(int i=0; i<nbrElem; i++)
{
cpt++;
if(a==tab[i])
{
for(int j=cpt-1; j<nbrElem-1; j++)
{
tab[j]=tab[j+1];
}
nbrElem--;
cout << "Element retire : " << a << endl << endl;
}
else { cout << "Error: Element inexistant." << endl << endl; }
}
}
else { cout << "Error: Vecteur vide." << endl << endl; }
}
template <class type> void VecteurTrie<type>::displayy(void)
{
if (nbrElem == 0)
{
cout << "Vecteur vide" <<endl;
}
else
{
for(type *i=pTop; i!=tab;)
{
cout << *--i << " ";
}
cout << endl;
}
}
// class destructor
template <class type> VecteurTrie<type>::~VecteurTrie()
{
delete[] tab;
}
template class VecteurTrie<int>;
template class VecteurTrie<Livre>; |
Ma classe VecteurTrie.h (au cas où):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #ifndef VECTEURTRIE_H
#define VECTEURTRIE_H
#include "Vecteur.h"
#include "vectorfullexception.h"
#include "livre.h"
/*
* No description
*/
template <class type> class VecteurIter;
template <class type> class VecteurTrie : public Vecteur
{
protected:
type *tab;
type *pTop;
int nbrElem;
public:
VecteurTrie();
VecteurTrie(int nb);
VecteurTrie(const VecteurTrie<type> &v);
~VecteurTrie();
type& operator[] (int i) {return *(tab+i);}
bool operator<(const VecteurTrie& v) const {return tab < v.tab;}
void insert(type a);
void removeElem(type a);
void displayy();
friend class VecteurIter<type>;
};
#endif // VECTEURTRIE_H |
Ma classe de test main.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include <cstdlib>
#include <iostream>
#include <stream.h>
#include "Livre.h"
#include "Vecteur.h"
#include "VecteurTrie.h"
using namespace std;
int main(int argc, char *argv[])
{
Livre p;
int elem;
int nbelem;
VecteurTrie<Livre> vtl(3); // je décide qu'il y a trois elems
cout << "Testons maintenant avec des livres." << endl;
cout << endl;
// je crée les livres:
char *aut[3]={"Tintin","Spirou","Haddock"};
Livre p0 ("Coucou je suis Pierre Bolle", 3, "977-2-87777-007-1", aut, 3, 45,"Science-fiction");
Livre p1 ("Coucou ", 3, "977-2-87799-007-2", aut, 3, 55,"Germain");
Livre p2 ("Coucou je suis ", 3, "977-2-87788-007-3", aut, 3, 65,"Fantaisie");
vtl.insert(p0);
vtl.insert(p1);
vtl.insert(p2);
//cout << "Vecteur de trois livres:" << endl << endl;
//vtl.displayy();
system("PAUSE");
return EXIT_SUCCESS;
} |
Le problème est qu'au moment de l'exécution, mon programme s'arrête crash, sans donner le moindre message d'erreur.
Je précise que si je teste ma surcharge directement dans la classe main, elle fonctionne très bien.
Si je teste mon tri avec des entiers, cela fonctionne très bien également.
Je débute en c++ et j'ai bien sur bien lu mon cours ainsi que la FAQ du forum avant de poster :(
Merci d'avance pour votre aide. :P