C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Probleme de membre static dans une classe de noeud

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
DELORME Frederic
Guest





PostPosted: Sun Sep 26, 2004 7:38 pm    Post subject: Probleme de membre static dans une classe de noeud Reply with quote



j'ai une classe CNode qui est articulée autour d'une membre statique (enfin,
c'est ce que j'aimerai ...)

La déclaration est la suivante :

<code> -----------------------------------------------------------
#include <iostream>
#include <cstring>

#ifndef E3DCNODE_H
#define E3DCNODE_H

using namespace std;

namespace E3D {

/**
Noeud d'un arbre

@author DELORME Frederic
*/
class CNode{
public:
        CNode();
        CNode(string psNodeName);
        CNode(string psNodeName, CNode *poParentNode);

        ~CNode();
        void init();
        void addChild(CNode *poNodeChild);
        void attachTo(CNode *poNodeParent);
        void remove(CNode *poNodeChild);

protected:
        static CNode *m_BaseNode;
        // Nom du noeud
        string m_Name;
        // Noeud Racine
        // Parent de ce noeud
        CNode *m_Parent;
        // Premier Enfant de ce noeud
        CNode *m_Child;
        // Enfant suivant de ce noeud
        CNode *m_Next;
        // Enfant précédent de ce noeud
        CNode *m_Prev;
};

};
#endif
----------------------------------------------------------- <code>

L'implémentation est la suivante :

<code> -----------------------------------------------------------
#include "cnode.h"

namespace E3D {

CNode::CNode(){
        this->m_Name = "noname";
        this->init();
}
/*!
        Création d'un noeud attaché à un parent.
        fn E3D::CNode::CNode(string *psNodeName)
        param psNodeName : Nom du noeud à créer.
 */
CNode::CNode(string psNodeName)
{
        this->m_Name = psNodeName;
        this->init();
}
/*!
        Création d'un noeud attaché à un parent.
        fn E3D::CNode::CNode(CNode *poParentNode)
        param poNodeName : Nom du noeud à créer.
        param poParentNode : Noeud parent.
 */
CNode::CNode(string psNodeName, CNode *poParentNode)
{
        this->m_Name = psNodeName;
        poParentNode->addChild(this);
}
/*!
        Constructeur par défaut
        fn E3D::CNode::CNode().
*/
CNode::~CNode()
{
        if(this->m_Child) delete this->m_Child;
        if(this->m_Next) delete this->m_Next;
        if(this->m_Prev) delete this->m_Prev;
}

void CNode::init(){
        if(!this->m_BaseNode){
                // oui, alors, on l'initialise
                this->m_BaseNode = this;
                this->m_Parent = NULL;
        }else{
                // Sinon on l'ajoute en tant qu'enfant.
                this->m_BaseNode->addChild(this);
        }
}

/*!
        Ajout d'un enfant à cet objet.
        fn E3D::CNode::addChild(const CNode *poNodeChild).
        param poNodeChild : Noeud enfant à ajouter.
*/
void CNode::addChild(CNode *poNodeChild){

        poNodeChild->attachTo(this);
/*      // Ce noeud a-t-il des enfants ?
        if( this->m_Child == NULL ){
                // NON, alors on l'ajoute en tant que premier enfant
                this->m_Child = poNodeChild;
                poNodeChild->m_Parent = this;
        }else{
                // OUI, alors, on recherche le dernier enfant
                CNode *ptrNode = this->m_Child;
                while( ptrNode->m_Next != NULL ){
                        ptrNode = ptrNode->m_Next;
                }
                ptrNode->m_Next = poNodeChild;
                poNodeChild->m_Prev = ptrNode;
        }
*/
}
/*!
        Attacher le Noeud courant au noeud parent donné.
        fn E3D::CNode::attachTo(CNode *poNodeParent)
        param poNodeParent : Parent auquel attacher le noeud.
*/
void CNode::attachTo(CNode *poNodeParent){
        if( poNodeParent->m_Child == NULL ){
                poNodeParent->m_Child = this;
        }else{
                CNode *ptrNode = poNodeParent->m_Child;
                while( ptrNode->m_Next != NULL ){
                        ptrNode = ptrNode->m_Next;
                }
                ptrNode->m_Next = this;
        }
}

/*!
        Supprimer le noeud donné.
        fn E3D::CNode::remove(CNode *poNode).
        param poNode : Noeud à supprimer
*/
void CNode::remove(CNode *poNode){
        // on récupère les précédents et suivants
        if(poNode){
                CNode *ptrNext = poNode->m_Next;
                CNode *ptrPrev = poNode->m_Prev;
                if( &poNode != &this->m_BaseNode ){

                // On enlève le noeud de la chaine
                if(ptrPrev!=NULL && ptrPrev->m_Next!=NULL) ptrPrev->m_Next = ptrNext;
                if(ptrNext!=NULL && ptrNext->m_Prev!=NULL) ptrNext->m_Prev = ptrPrev;
                delete poNode;
                }else{
                        delete this;
                }
        }
}

};
----------------------------------------------------------- <code>


et j'ai l'erreur suivante à la compilation ....


<log> ------------------------------------------------------------
*/home/fred/Projets/cpp/testsdl/src/cnode.cpp:61: undefined reference to
`E3D::CNode::m_BaseNode'
*cnode.o(.text+0x50b):/home/fred/Projets/cpp/testsdl/src/cnode.cpp:63:
undefined reference to `E3D::CNode::m_BaseNode'
*cnode.o(.text+0x523):/home/fred/Projets/cpp/testsdl/src/cnode.cpp:67:
undefined reference to `E3D::CNode::m_BaseNode'
*/home/fred/Projets/cpp/testsdl/src/cnode.cpp:122: undefined reference to
`E3D::CNode::m_BaseNode'
------------------------------------------------------------ <log>

Vous avez une idée du pourquoi du comment ?

Par avance merci !

F.Delorme.
Back to top
Loïc Joly
Guest





PostPosted: Sun Sep 26, 2004 8:06 pm    Post subject: Re: Probleme de membre static dans une classe de noeud Reply with quote



DELORME Frederic wrote:


Quote:
Vous avez une idée du pourquoi du comment ?

Non, parce que ton code ne donne pas particulièrement envie d'être lu,
il y en a trop. Serait-il possible de poster ce que les gens de fctt
appellent un ECM, c'est à dire un exemple complet et minimal. Le strict
minimum compilable qui reproduise le problème. Deux avantages :

- Les gens qui lisent en ont une vue synthètique et sont plus à même de
faire l'effort de chercher l'erreur ;
- Souvent en faisant ça, on se rend compte soi même du problème.

Enfin, si tu pouvait indiquer la ligne référencée dans le message
d'erreur, ça nous éviterait de devoir recompter à la main.

Merci,

--
Loïc

Back to top
Olivier.luong@free.fr
Guest





PostPosted: Sun Sep 26, 2004 10:59 pm    Post subject: Re: Probleme de membre static dans une classe de noeud Reply with quote



A vu de nez, ton membre static n'est pas initialisé,
il te faudrait quelque chose comme :

CNode::m_BaseNode= NULL;

dans ton .CPP
Olivier

"DELORME Frederic" <delorme.frederic (AT) free (DOT) fr> a écrit dans le message de
news: 41571a6e$0$25680$626a14ce (AT) news (DOT) free.fr...
Quote:
j'ai une classe CNode qui est articulée autour d'une membre statique
(enfin,
c'est ce que j'aimerai ...)

La déclaration est la suivante :

code> -----------------------------------------------------------
#include <iostream
#include
#ifndef E3DCNODE_H
#define E3DCNODE_H

using namespace std;

namespace E3D {

/**
Noeud d'un arbre

@author DELORME Frederic
*/
class CNode{
public:
CNode();
CNode(string psNodeName);
CNode(string psNodeName, CNode *poParentNode);

~CNode();
void init();
void addChild(CNode *poNodeChild);
void attachTo(CNode *poNodeParent);
void remove(CNode *poNodeChild);

protected:
static CNode *m_BaseNode;
// Nom du noeud
string m_Name;
// Noeud Racine
// Parent de ce noeud
CNode *m_Parent;
// Premier Enfant de ce noeud
CNode *m_Child;
// Enfant suivant de ce noeud
CNode *m_Next;
// Enfant précédent de ce noeud
CNode *m_Prev;
};

};
#endif
-----------------------------------------------------------
L'implémentation est la suivante :

code> -----------------------------------------------------------
#include "cnode.h"

namespace E3D {

CNode::CNode(){
this->m_Name = "noname";
this->init();
}
/*!
Création d'un noeud attaché à un parent.
fn E3D::CNode::CNode(string *psNodeName)
param psNodeName : Nom du noeud à créer.
*/
CNode::CNode(string psNodeName)
{
this->m_Name = psNodeName;
this->init();
}
/*!
Création d'un noeud attaché à un parent.
fn E3D::CNode::CNode(CNode *poParentNode)
param poNodeName : Nom du noeud à créer.
param poParentNode : Noeud parent.
*/
CNode::CNode(string psNodeName, CNode *poParentNode)
{
this->m_Name = psNodeName;
poParentNode->addChild(this);
}
/*!
Constructeur par défaut
fn E3D::CNode::CNode().
*/
CNode::~CNode()
{
if(this->m_Child) delete this->m_Child;
if(this->m_Next) delete this->m_Next;
if(this->m_Prev) delete this->m_Prev;
}

void CNode::init(){
if(!this->m_BaseNode){
// oui, alors, on l'initialise
this->m_BaseNode = this;
this->m_Parent = NULL;
}else{
// Sinon on l'ajoute en tant qu'enfant.
this->m_BaseNode->addChild(this);
}
}

/*!
Ajout d'un enfant à cet objet.
fn E3D::CNode::addChild(const CNode *poNodeChild).
param poNodeChild : Noeud enfant à ajouter.
*/
void CNode::addChild(CNode *poNodeChild){

poNodeChild->attachTo(this);
/* // Ce noeud a-t-il des enfants ?
if( this->m_Child == NULL ){
// NON, alors on l'ajoute en tant que premier enfant
this->m_Child = poNodeChild;
poNodeChild->m_Parent = this;
}else{
// OUI, alors, on recherche le dernier enfant
CNode *ptrNode = this->m_Child;
while( ptrNode->m_Next != NULL ){
ptrNode = ptrNode->m_Next;
}
ptrNode->m_Next = poNodeChild;
poNodeChild->m_Prev = ptrNode;
}
*/
}
/*!
Attacher le Noeud courant au noeud parent donné.
fn E3D::CNode::attachTo(CNode *poNodeParent)
param poNodeParent : Parent auquel attacher le noeud.
*/
void CNode::attachTo(CNode *poNodeParent){
if( poNodeParent->m_Child == NULL ){
poNodeParent->m_Child = this;
}else{
CNode *ptrNode = poNodeParent->m_Child;
while( ptrNode->m_Next != NULL ){
ptrNode = ptrNode->m_Next;
}
ptrNode->m_Next = this;
}
}

/*!
Supprimer le noeud donné.
fn E3D::CNode::remove(CNode *poNode).
param poNode : Noeud à supprimer
*/
void CNode::remove(CNode *poNode){
// on récupère les précédents et suivants
if(poNode){
CNode *ptrNext = poNode->m_Next;
CNode *ptrPrev = poNode->m_Prev;
if( &poNode != &this->m_BaseNode ){

// On enlève le noeud de la chaine
if(ptrPrev!=NULL && ptrPrev->m_Next!=NULL) ptrPrev->m_Next = ptrNext;
if(ptrNext!=NULL && ptrNext->m_Prev!=NULL) ptrNext->m_Prev = ptrPrev;
delete poNode;
}else{
delete this;
}
}
}

};
----------------------------------------------------------- <code


et j'ai l'erreur suivante à la compilation ....


log> ------------------------------------------------------------
*/home/fred/Projets/cpp/testsdl/src/cnode.cpp:61: undefined reference to
`E3D::CNode::m_BaseNode'
*cnode.o(.text+0x50b):/home/fred/Projets/cpp/testsdl/src/cnode.cpp:63:
undefined reference to `E3D::CNode::m_BaseNode'
*cnode.o(.text+0x523):/home/fred/Projets/cpp/testsdl/src/cnode.cpp:67:
undefined reference to `E3D::CNode::m_BaseNode'
*/home/fred/Projets/cpp/testsdl/src/cnode.cpp:122: undefined reference to
`E3D::CNode::m_BaseNode'
------------------------------------------------------------
Vous avez une idée du pourquoi du comment ?

Par avance merci !

F.Delorme.



Back to top
DELORME Frederic
Guest





PostPosted: Mon Sep 27, 2004 2:37 am    Post subject: Re: Probleme de membre static dans une classe de noeud Reply with quote

Loïc Joly wrote:

Quote:
DELORME Frederic wrote:


Vous avez une idée du pourquoi du comment ?

Non, parce que ton code ne donne pas particulièrement envie d'être lu,
il y en a trop. Serait-il possible de poster ce que les gens de fctt
appellent un ECM, c'est à dire un exemple complet et minimal. Le strict
minimum compilable qui reproduise le problème. Deux avantages :

- Les gens qui lisent en ont une vue synthètique et sont plus à même de
faire l'effort de chercher l'erreur ;
- Souvent en faisant ça, on se rend compte soi même du problème.

Enfin, si tu pouvait indiquer la ligne référencée dans le message
d'erreur, ça nous éviterait de devoir recompter à la main.

Merci,

Désolé, je serai plus conci la prochaine fois.

Merci Olivier, c'était bien cela l'erreur.
De plus, Dave Eberly m'a fait une super réponse sur un autre forums (ou
d'ailleurs j'avais posté par erreur.... la fatigue oulalala ...)
Merci a tous.

--
Fred


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.