IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Probleme arbre/liste chainée en template


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut Probleme arbre/liste chainée en template
    Salut a tous.

    Voila je vous expose mon petit probleme. Je veux créer une classe representant au choix un arbre binaire ou une liste chainée, le tout en template.

    Au niveau fonctionnement normal ca va. Mais c'est la premiere fois que j'essaie de créez une classe en template. Donc je me suis renseigné un peu sur le net mais j'ai encore quelques probleme. voila mon header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #ifndef __R__CSTOCK__R_6589
    #define __R__CSTOCK__R_6589
     
    #include "stdAfx.h"
    #include <iostream>
     
    //CDumange Classe de stockage qui roxe. En mode !ARBRE -> liste chainé. EN mode Arbre -> ben arbre
    #define MODE_ARBRE 1
    #define MODE_NONARBRE 0
     
    template <class TEMP>
    class CStock
    {
    	private:
    		TEMP m_value;
    		CStock *m_gauche, *m_droite;
    		int m_ntaille, m_mode;
    	public :
    		void Add (TEMP p_value);
    		void RemoveAll ();
    		TEMP Search (TEMP p_value);
    		int GetSize ();
     
    		CStock(int p_mode =MODE_NONARBRE);
    		CStock(TEMP p_value, int p_mode =MODE_NONARBRE);
    		~CStock();
    };
     
    #endif
    Jusque la normalemen,t pas de probleme... VOici les fonctions que j'ai eu le temps de code pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    CStock::CStock(int p_mode)
    {
    	m_gauche = 0;
    	m_droite = 0;
    	m_ntaille = 0;
    	m_mode = p_mode
    }
     
    //______________________________________________________________
    //Constructeur permettant de rajouter une valeur a la création
    template <class TEMP>
    CStock<TEMP>::CStock(TEMP p_value, int p_mode)
    {
    	CStock();
    	Add(p_value, p_mode);
    }
     
    //_____________________________________________________________
    //Ajout dans l'arbre. Si on est en mode NONARBRE, on ajoute toujours a gauche.
    template <class TEMP>
    void CStock<TEMP>::Add(TEMP p_value)
    {
    	//Si le noeud ou je suis est vide
    	if (TEMP == NULL)
    	{
    		m_value = p_value;
    		m_ntaille ++;
    	}
    	else
    	{
    		//En mode non arbre, j'ajoute toujours a gauche
    		if (m_mode == MODE_NONARBRE)
    		{
    			if(!m_gauche)
    				m_gauche = new CStock(m_mode);
    			*m_gauche.Add(p_value);
    		}
    		else
    		{
    			//Si plus grand, j'essaie d'aller ajouter a droite
    			if (p_value > m_value)
    			{
    				if(!m_droite)
    					m_droite = new CStock(m_mode;
    				*m_droite.Add(p_value);
    			}
    			//Sinon a gauche
    			else
    			{
    				if(!m_gauche)
    					m_gauche = new CStock(m_mode)
    				*m_gauche.Add(p_value);
    			}
    		}
    	}
    }
    La rien ne va plus... j'ai des messages d'erreur me disant que m_gauche et m_droite n'appartiennent pas a la classe (comme les autres variables membres d'ailleur). J'ai aussi Add qui n'est pas membre de lopérateur ''global namespace.

    Enfin bref rien ne marche :/

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Je passe sur le design plus que discutable d'une structure de donnée qui offre deux
    comportements distincts, choisi à la création. Sur le fait aussi, que lorsque l'on crée ce type
    de structure, généralement, on crée une base non template dont on hérite ensuite.

    Pour que SYNTAXIQUEMENT le code soit correct, il faut (entre autre) que tout les noms de variable dans le code du template soit complétement qualifiés.
    Cela se résume dans ton cas à ajouter un 'this->' devant chaque attribut de ta classe.
    Ensuite, je doute que le test de la première ligne de Add() marche.
    TEMP est un type et non une variable.

    Une dernière chose, on utilise rarement la notation *pObj.function(), on quand pObj est un
    pointeur. Généralement, on préfère pObj->function()

    Ah oui, une dernière pour la route. On utilise pas #define quand on peut éviter (et c'est le cas ici).

Discussions similaires

  1. probleme bizarre liste chainées
    Par matt36295 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/03/2013, 14h42
  2. Encore un probleme de Liste chainée
    Par publicStaticVoidMain dans le forum C
    Réponses: 8
    Dernier message: 11/05/2009, 16h51
  3. Probleme avec liste chainée
    Par Lucas42 dans le forum C
    Réponses: 3
    Dernier message: 20/11/2007, 19h46
  4. probleme avec liste chainée
    Par isoman dans le forum C
    Réponses: 14
    Dernier message: 29/11/2006, 23h03
  5. probleme avec liste chainée
    Par Liiscar dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/11/2006, 20h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo