Erreur compilateur sur liste doublement chaînée générique
Bonjour,
toujours dans ce projet j'ai maintenant une erreur de compilation.
(je vous présente d'abord les extraits de code PUIS les questions)
(dans les extraits suivants je coupe volontairement le code)
J'ai créé un noeud
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
template <typename T>
struct DNode
{
T val; //!< Value for this node, can be anything
DNode<T> *prev; //!< Pointer to the previous node
DNode<T> *next; //!< Pointer to the next node
// constructeur par défaut et copie mais pas destructeur et autres méthodes pratiques
//! Destructor is useless because automatically called when deleting struct DNode, setting a destructor will cause calling ~T twice
/*~DNode()
{
//! Default destructor
//! @todo : if val = NULL, what happens when calling its destructor ?
val.~T(); // explicit call to the destructor
}*/
} |
puis la liste avec sentinelles
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
template <typename T>
class DLList
{
// typedef struct DNode<T> Node; this could be used to simplify the writing
friend class testDLList; // provide access for a test class
friend class testIterators;
private :
DNode<T>* head; //! Handle on first data node (if any)
DNode<T>* tail; //! Handle on last data node (if any)
DNode<T>* fore; //! Handle on leading sentinel node
DNode<T>* aft; //! Handle on trailing sentinel node
unsigned int m_size; //! Holds the number of nodes
// constructeurs, méthodes, destructeurs, itérateurs ...
} |
Je vais utiliser cette liste pour stocker des pointeurs d'une classe TranslatableObserver disons donc quelque part j'ai ça en membre d'une classe :
Code:
1 2
|
DLList<TranslatableObserver*> list; |
Ensuite, j'ai l'erreur de compilation suivante :
Citation:
error: invalid conversion from ‘void*’ to ‘DNode<TranslatableObserver*>*’
l'erreur se situe dans le destructeur de ma DLList donc voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
template <typename T>
DLList<T>::~DLList(void)
{
// Deallocate all nodes, even the sentinels
DNode<T>* temp = NULL;
while(fore != NULL)
{
temp = fore;
fore = fore->next;
delete temp;
}
// the following statement is not completely true :
// Don't need to set head and tail to NULL nor m_size to 0 because we don't care right now
head = NULL;
tail = NULL;
fore = NULL;
aft = NULL;
m_size = 0;
} |
Le problème se situe sur les "= NULL", avec dans mon cas :
Code:
#define NULL ((void*)0)
Les questions :
1 - Vous remarquez que j'ai volontairement dégagé struct DNode<T>::~DNode<T>() (ou tout simplement le destructeur d'un noeud).
Lors de mes tests j'ai crée une classe 'personne' comportant un membre int et un tableau name avec allocation dynamique. Dans le destructeur de 'personne' je faisais un delete de 'name' sans mettre 'name' à NULL, chose que j'avais jugée inutile.
Ensuite, je stockais une liste de 'personne', les noeuds étant donc des 'personne'.
Je me suis aperçu lors du debug qu'en détruisant un noeud je passais deux fois dans le destructeur de 'personne' et puisque personne::name n'avait pas été mis à NULL la première fois alors plantage. La seule solution que j'ai trouvé a été d'enlever le destructeur d'un noeud pour éviter que struct DNode<T>::~T() soit appelé deux fois. Pourquoi est-il appelé deux fois ?
2 - Pourquoi pour résoudre mon erreur de compilation je peux mettre 0 à la place de NULL ?