Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1309 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [G++] Héritage de classe template, je sais c'est redondant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[G++] Héritage de classe template, je sais c'est redondant

n°1229227
djar
Posté le 23-10-2005 à 22:44:31  profilanswer
 

Salut à tous !
Désolé pour ce problème redondant (j'ai déjà regardé les autres posts) mais j'ai un problème avec l'héritage de classe template sous g++ que je n'arrive pas à résoudre...
J'ai une classe template arbre.h qui fonctionne parfaitement et qui a des données en protected et en public, mais
hélas, le code de l'héritage suivant ne fonctionne pas !
 
Aidez moi s'il vous plait !!!
 
 

Code :
  1. template <class Type1, class Type2> class ArbreBinaire : public Arbre<Type1, Type2> {
  2. public:
  3.  // Constructeur de la classe
  4.  ArbreBinaire() { Arbre<Type1, Type2>::Arbre(); }
  5.  // Constructeur par recopie
  6.  ArbreBinaire(const ArbreBinaire & unArbre) {
  7.    Arbre<Type1, Type2>::Arbre(unArbre);
  8.  }
  9.  // Constructeur avec paramètres (dont deux par défaut).
  10.  ArbreBinaire(Type1 info1, Type2 info2) {
  11.   Arbre<Type1, Type2>::Arbre(info1, info2);
  12.  }
  13.  // Constructeur avec paramètres (dont deux par défaut).
  14.  ArbreBinaire(Type1 * info1, Type2 * info2) {
  15.   Arbre<Type1, Type2>::Arbre(info1, info2);
  16.  }
  17.  // Destructeur de la classe (désalloue les pointeurs pour  
  18.  // la données et pour les feuilles)
  19.  ~ArbreBinaire() {
  20.   Arbre<Type1, Type2>::~Arbre();
  21.  }
  22. };

mood
Publicité
Posté le 23-10-2005 à 22:44:31  profilanswer
 

n°1229228
jesus_chri​st
votre nouveau dieu
Posté le 23-10-2005 à 22:48:11  profilanswer
 

Code :
  1. template <typename Type1, typename Type2> class ArbreBinaire : public Arbre<Type1, Type2> {
  2.     public:
  3.         // Constructeur de la classe  
  4.         ArbreBinaire() {}
  5.         // Constructeur par recopie  
  6.         ArbreBinaire(const ArbreBinaire & unArbre) :
  7.                 Arbre<Type1, Type2>(unArbre) {
  8.         }
  9.         // Constructeur avec paramètres (dont deux par défaut).  
  10.         ArbreBinaire(Type1 info1, Type2 info2) :
  11.             Arbre<Type1, Type2>(info1, info2) {
  12.         }
  13.         // Constructeur avec paramètres (dont deux par défaut).  
  14.         ArbreBinaire(Type1 * info1, Type2 * info2) : 
  15.             Arbre<Type1, Type2>(info1, info2) {
  16.         }
  17.         // Destructeur de la classe (désalloue les pointeurs pour   
  18.         // la données et pour les feuilles)  
  19.         ~ArbreBinaire() { }
  20. };


 
un rappel de constructeur c'est après ":" et pas après "{"
le rappel de destructeur est automatique, idem avec le constructeur par défaut.
 

Code :
  1. // Constructeur avec paramètres (dont deux par défaut).   
  2.         ArbreBinaire(const Type1& info1, const Type2& info2) : 
  3.             Arbre<Type1, Type2>(info1, info2) { 
  4.         }

c'est mieux je pense


Message édité par jesus_christ le 23-10-2005 à 22:54:36
n°1229231
djar
Posté le 23-10-2005 à 22:52:13  profilanswer
 

Ca fonctionne pour les constructeurs mais pas pour le destructeur...


Message édité par djar le 23-10-2005 à 22:54:29
n°1229233
Taz
bisounours-codeur
Posté le 23-10-2005 à 22:58:05  profilanswer
 

#       // Destructeur de la classe (désalloue les pointeurs pour  
#         // la données et pour les feuilles)
#         ~ArbreBinaire() {  
#             Arbre<Type1, Type2>::~Arbre();
#         }
 
dégage ça.

n°1229234
jesus_chri​st
votre nouveau dieu
Posté le 23-10-2005 à 22:58:47  profilanswer
 

Code :
  1. {
  2.    ArbreBinaire<T, Q> arbre; // constructeur par défaut
  3. } // appel destructeur de ArbreBinaire puis de Arbre


 
comment t'as testé que ça marche pas ?
La testruction d'un dérivé est suivie de la destruction de l'objet de base.
sauf en cas de polymorphisme dans quel cas t'as oublié de mettre le destructeur virtual -> appel du destructeur de base seulement.
 

Code :
  1. {
  2.    Arbre<T, Q>* arbre = new ArbreBinaire; // constructeur par défaut
  3. } // appel destructeur de Arbre seulement si pas virtual

n°1229235
jesus_chri​st
votre nouveau dieu
Posté le 23-10-2005 à 23:00:18  profilanswer
 

de façon générale, on n'a jamais à appeler explicitement un destructeur. Je me demande pourquoi c'est permis d'ailleurs. Taz, t'aurais un exemple de bonne utilisation de ~T explicite ?
[edit] j'y pense : pour surcharger delete ? A part ça je ne vois pas l'utiliter d'appeler ~T().


Message édité par jesus_christ le 23-10-2005 à 23:05:58
n°1229236
djar
Posté le 23-10-2005 à 23:02:53  profilanswer
 

Ha ! Oui effectivement ok, c'est bon le problème est reglé...

n°1229237
Taz
bisounours-codeur
Posté le 23-10-2005 à 23:07:31  profilanswer
 

oui. Quand tu dissocies allocation et construction/destruction.
 

Code :
  1. void *p = malloc(sizeof(T));
  2. T *t = new (p) T;
  3. t->~T();
  4. free(p);

;
 
edit: typo


Message édité par Taz le 23-10-2005 à 23:13:07
n°1229238
jesus_chri​st
votre nouveau dieu
Posté le 23-10-2005 à 23:09:28  profilanswer
 

ah oui avec le placement new.
merci Taz !  [:mulder]
je vais me coucher tiens...  :sleep:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [G++] Héritage de classe template, je sais c'est redondant

 

Sujets relatifs
Utiliser une constante définie en dehors d'une classe dans celle-ciTemplate PHPlib : Include();
[C++] instanciation templateprobleme heritage
Redéfinition du flux et templatePetite classe simple compile sous Visual mais pas g++.
utilisation de classe friend[résolu] Faire cohabiter une ID et un classe dans la même balise ???
Pb d association une classe a nune boite de dialog[Php][Classe][Debutant] hum, où est l'erreur dans ma classe?
Plus de sujets relatifs à : [G++] Héritage de classe template, je sais c'est redondant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR