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

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

Marsh Posté le 23-10-2005 à 22:44:31    

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. };

Reply

Marsh Posté le 23-10-2005 à 22:44:31   

Reply

Marsh Posté le 23-10-2005 à 22:48:11    

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
Reply

Marsh Posté le 23-10-2005 à 22:52:13    

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


Message édité par djar le 23-10-2005 à 22:54:29
Reply

Marsh Posté le 23-10-2005 à 22:58:05    

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

Reply

Marsh Posté le 23-10-2005 à 22:58:47    

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

Reply

Marsh Posté le 23-10-2005 à 23:00:18    

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
Reply

Marsh Posté le 23-10-2005 à 23:02:53    

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

Reply

Marsh Posté le 23-10-2005 à 23:07:31    

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
Reply

Marsh Posté le 23-10-2005 à 23:09:28    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed