Problème template c++ - C++ - Programmation
Marsh Posté le 05-11-2011 à 23:52:57
donne ton main.
Un template doit être défini aussi dans le .h et non pas dans un .cpp
Edit : à la lecture de ton code, j'ai comme l'impression que tu espères que l'opérateur << pourra bénéficier du polymorphisme. Ce n'est pas le cas. Donne aussi quelques exemples de classes que tu utilises, comme Carte, Collectionneur, ConcepteurAlbum et les classes dérivées s'il y en a,et montre nous, dans ton main donc, les appels que tu fais.
Marsh Posté le 06-11-2011 à 10:56:48
Bonjour,
Tout d'abord, merci pour ta réponse.
Oui, en effet normalement le code d'un template doit être dans le header mais j'ai essayé de tout mettre dans le header (et aussi (même si c'est pareil) d'inclure le cxx à la fin du header) et ça ne change absolument rien à l'exécution.
Voici le main (enfin, la partie concernée qui est faite dans un fonction void).
Code :
|
En fait, il s'agit d'une hiérarchie de classe et chaque classe fille redéfinis brièvement l'opérateur << (en appelant celui de la classe mère).
Voici la hiérarchie dont fait partie la classe Collectionneur ;
Header de la classe Personne ;
Code :
|
Corps ;
Code :
|
Beaucoup de lignes superflues ont été ajoutée uniquement dans le but de tester/tracer. J'ai fais énormément de test avant de demander de l'aide.
Header de la classe AuthorisedPerson (Classe abstraite dérivée de Personne).
Code :
|
Cxx ;
Code :
|
Header de la classe Collectionneur (suivit du corps) qui dérive de AuthorisedPerson
Code :
|
Collectionneur.cxx
Code :
|
Voilà, je rappel qu'il s'agit d'un cas d'école.
Merci de ton aide.
Marsh Posté le 06-11-2011 à 15:58:40
y'aurait plein de choses à redire. Il manque la déclaration de ton template Structure pour être exhaustif.
Cela dit, je pense que le premier problème auquel tu te butes, c'est qu'il manque la déclaration de tes opérateurs.
Ton prof attend sans doute que tu mettes en avant le polymorphisme. Du coup, tu n'as besoin que d'un seul opérateur qui prend en entrée une Personne (par référence constante comme tu le fais très bien). Déclare une fonction d'affichage qui va être virtuelle au niveau de personne, et surcharge-là à chaque étage de ton héritage. Retire tes autres opérateurs, et surtout, déclare les opérateurs dans tes .h (l'implémentation reste dans le .cpp)
Ensuite, attention à tes sprintf, ils sont complètement faux. Par exemple :
Code :
|
là, tu demandes un buffer pour écrire une chaine. Tu sais que cette chaine va être de la taille de ce que tu mets en dur dans ton formatage (au moins 16 caractères) + la taille du nom (c'est bien, tu en as tenu compte) + la taille en caractères du nombre de collections (log à base 10 de ce nombre) + 1 pour le zéro terminal. Avec le code que tu as écrit, c'est sur que tu débordes. Ca peut faire tout et nimporte quoi dans ton programme, mais surtout le faire crasher.
Normalement, tu ne devrais pas avoir de "magic numbers", comme ton tableau de 22 caractères dans la même fonction ou ton "+10" pour le buffer.
Après, j'ai pas tout relu, loin de là. Il faudrait que tu apprennes à te servir de ton debugger, pour ce genre de chose, ca t'aidera grandement pour le développement de tes programmes suivants. J'imagine que vous avez eu un bref cours sur gdb si on vous fait programmer sous solaris. Il va être temps de s'en servir (sinon, tu trouveras de la doc sur le net ...)
Marsh Posté le 05-11-2011 à 21:28:20
Bonjour à tous et à toutes,
Je rencontre un problème que je ne parviens pas à résoudre avec les templates.
En fait, j'ai une classe template Vecteur (qui agit comme un vecteur...). Elle agit normalement lorsque le type est un entier, par contre, dés qu'il s'agit d'une classe, on dirait que la fonction membre d'affichage des éléments oublie le type (alors que si je l'affiche élément par élément tout se passe bien).
J'utilise g++ v3.4.3 sur Solaris 10.
Voici le code de la classe Vecteur (header et cxx)
La classe template Structure n'est qu'une classe générique, je ne pense pas qu'il soit possible que le problème vienne de là.
Voici le résultat (l'endroit ou ça casse).
Personne
Nom : Coptere //test d'une des classe, ici, c'est déjà un problème puisqu'apparement il affiche
Prenom : Eli //le type comme si il s'agissait d'une des classes mère de ma classe concernee
Date de naissance : 25/03/1990
Nationalite : francais
------------------------------------------
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //Cette ligne est dans le main()
Collect //affichage qui sert à tracer la surcharge du << dans chaque classe de la
Personne //Hièrarchie
Nom : Sonite
Prenom : Sam
Date de naissance : 11/01/1992
Nationalite : belge
Author
Login : sonitesa
Nombre de Collections : 6
On ajoute Sonite en utilisant l'operateur +
Author
0.
Personne
Nom : //S'arrête ici
Voilà, ici (mais c'est pareil avec les autres classes) il s'agit d'une hièrarchie ;
class Personne (Classe mère)
class AuthorisedPerson : public Personne (Classe abstraite)
class Collectionneur : public AuthorisedPerson
class ConcepteurAlbum : public AuthorisedPerson
Je suis désolé de ne pas pouvoir rendre le problème plus général avec un code plus court. Je pense qu'il doit s'agir d'un cas assez particulier.
Voilà, en espèrant que vous pourrez m'aider. Si besoin, je peux ajouter les valeurs que peuvent prendre le type (le code des différentes classes).
J'ajoute qu'il s'agit d'un cas d'école et que je suis obligé de travailler comme ça.
Je vous remercie d'avance.
Bonne soirée.
Christallis