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

C++ Discussion :

amélioration d'une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut amélioration d'une classe
    Il s'agit d'une classe que j'ai faite moi meme en m'inspirant de
    d'un tuto sur les listes chainées.

    Il s'agit d'un truc de débutant/

    alors que pensez vous de ma classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Node {
    public: 
    	Node();//constructeur par défaut (?)
    	Node(int d, Node* p): data(d), next(p){}//quel type de constructeur (?)
    	~Node();
    	int data;
    	Node* next;
    	void push(Node**,int);
    	void view(Node* );
    	void supr(Node**);
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Node::push(Node** mapile,int valeur){
        Node* element=new Node(valeur,*mapile);
         *mapile=element; 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Node::view(Node* pile){
      while( pile ){
    		cout<<(*pile).data;
           pile=pile->next;   
      }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Node::supr(Node** mapile){
    	Node* temp=(*mapile)->next;
    	(*mapile)=temp;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main(){
    	 int n;
    	 Node* p=NULL;	p->push(&p,3);p->push(&p,7);p->push(&p,9);p->push(&p,8);//push(&p,1);push(&p,5);push(&p,4);push(&p,2);
    	 Node* j=(*p).next;	 
    	 p->supr(&p);p->view(p);
     }
    voila c'est une pile, une liste chainée plus exactement.
    je cherche a l'améliorer en mettant par exemple des "static" ou autre améliorations.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 291
    Par défaut ???
    Bonsoir,
    je ne suis pas une pro du c++ donc il y a peut etre des choses que je ne connais pas ou ne comprends pas, mais...
    On dirait pas une classe...
    D'abord parce que tu passe en parametre de methodes de ta classe des objets de celle-ci... Aucune utilisation de this et de ces avantages...

    La pile c'est donc data je suppose (un attribut donc plutot private ou protected mais pas public). Ah non c'est pas data... (apres relecture )
    Je comprends pas comment tu as construis ta classe...

    Tu pourrais expliciter davantage s'il te plait?

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    La pile c'est donc data je suppose (un attribut donc plutot private ou protected mais pas public). Ah non c'est pas data... (apres relecture )

    >>benn non, la classe c'est "node".
    Telle que je l'ai créee, les objets instanciés par cette classe sont des "noeuds" qui contiennent une valeur (data) et qui pointent sur le noed suivant.

    Aucune utilisation de this et de ces avantages...
    >>je vais voir comment on peut améliorer ca, en utilisant des this.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 291
    Par défaut
    Rien à faire...
    A part le constructeur je vois pas a quoi ça sert.
    C'est juste une classe avec deux valeurs : un int et un pointeur sur le noeud suivant. Donc les operations push et cie de la pile devrait etre en dehors de la classe non? Puisque c'est pas une pile c'est juste un element de la pile
    Il faudrait juste des getters et setters sur les attributs (en private)...
    Qu'en penses tu?

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Donc les operations push et cie de la pile devrait etre en dehors de la classe non? Puisque c'est pas une pile c'est juste un element de la pile
    je suis d'accord avec toi, c'était juste pour m'entrainer.

    j'aurais pu simplement utiliser les struct ou les typedef struct

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 291
    Par défaut
    Oui c'est sur.
    Le probleme c'est que là en plus y a pas la philosophie objet derriere. Pourquoi ne pas faire une classe pile? Ce serait beaucoup plus interressant! avec un CArray de nodes en attributs par exemple...

    Au fait hesites pas à utiliser la fonction "citer" du forum c'est plus sympa à lire.

    Sur ce, je vais aller dormir !

    Bonne soirée

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    On ne programme pas en C comme on programme en C++. Le C++ permet d'encapsuler ses données, ce dont tu ne profites pas. Et il est toujours louche d'avoir dans une classe des méthodes qui prennent en paramètre cet même classe. Toutes tes méthodes pourraient très bien être statiques, ce qui n'a plus d'intérêt dans une classe.

    J'ai réécris en vitesse ta classe pour te montrer. C'est complétement rediscutable. Remarque qu'il n'y a plus de Node en paramètre des méthodes.

    Pour terminer, je te conseillerai, comme je te l'ai déjà dit précédemment de suivre des tutoriaux de C++ et de regarder la STL puisque tu veux apprendre le C++. On ne pense malheureusement pas de la même façon en C qu'en C++.


    typedef struct
    pas de typedef struct en C++

    list.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct node;
     
    class List {
     public: 
      List();
      ~List();
      void push(int);
      void view();
     private :
      node *base; // Premier element de la liste
      node *heap; // Tete de la liste
    };
    list.cpp
    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
     
    #include "list.h"
     
    #include <iostream>
    using namespace std;
     
    struct node {
      int data;
      node *next;
      node (int d, node *n) : data (d), next (n) {}
    };
     
    List::List () : base (NULL), heap (NULL) {}
     
    List::~List () {
      node *next = base;
      while (next != NULL) {
        node *current = next;
        next = next->next;
        delete current;
      }
    }
     
    void List::push(int valeur){
      node *element = new node (valeur, NULL);
      if (base == NULL) base = element;
      if (heap != NULL) heap->next = element;
      heap = element;
    }
     
    void List::view(){
      node *pile = base;
      while (pile) {
        cout << pile->data << " ";
        pile = pile->next;
      }
      cout << endl;
    }
    listmain.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "list.h"
     
    int main(){
      List l;
      l.push (3);
      l.push (7);
      l.push (9);
      l.push (8);
      l.view ();
      return 0;
    }

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    J'ai réécris en vitesse ta classe pour te montrer. C'est complétement rediscutable. Pour terminer, je te conseillerai, comme je te l'ai déjà dit précédemment de suivre des tutoriaux de C++ puisque tu veux apprendre le C++. On ne pense malheureusement pas de la même façon en C qu'en C++.
    J'ai lu que le C++ n'est pas un sous ensemble du C, mais de la a dire qu'on ne pense pas de la meme facon...

    Je veux bien te croire, mais Je me suis inspiré d'un livre de C++ pour faire cette classe:

    Celui de Dehanoy, et celui aussi de John Hubbard, qui sont des livres de C++


    pas de typedef struct en C++
    je veux pas te contredire, mais vas dans le livre de Stroustrup, page 84:
    tu verras, il est écrit:
    4.9.7 Typedef
    A declaration prefixed by the keyword typedef declares a new name for the type.....


    Merci pour le code.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Le C est un langage impératif.
    Le C++ est un langage objet.
    On ne conçoit, pense donc pas de la même façon.

    je veux pas te contredire
    Oui, j'aurais du préciser.

    En C, on fera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct {
      int data;
      node *next;
    } node;
    mais en C++, le code suivant suffira
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct node {
      int data;
      node *next;
    };
    Mais bien sûr, typedef est utile de manière générale en C++.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par deubelte Voir le message
    J'ai lu que le C++ n'est pas un sous ensemble du C, mais de la a dire qu'on ne pense pas de la meme facon...
    Je pense qu'on réfléchis dans les deux langage avec les mêmes principes en tête, mais que les moyens permettant de les mettre en oeuvre sont très différents.

    Citation Envoyé par deubelte Voir le message
    Je veux bien te croire, mais Je me suis inspiré d'un livre de C++ pour faire cette classe:

    Celui de Dehanoy, et celui aussi de John Hubbard, qui sont des livres de C++
    Le deuxième, je connais pas, mais les Delannoye que j'ai pu feuilleter étaient assez catastrophiques. Il parrait qu'il s'est un peu amélioré dans les dernières éditions, mais j'ai quand même un a priori négatif.


    Citation Envoyé par deubelte Voir le message
    je veux pas te contredire, mais vas dans le livre de Stroustrup, page 84:
    tu verras, il est écrit:
    4.9.7 Typedef
    A declaration prefixed by the keyword typedef declares a new name for the type.....
    En C++, en effet, typedef existe, et permet de déclarer un nouveau nom pour un type existant. Là, tu es en train de définir un nouveau type, et même si ta syntaxe est correcte (par compatibilité avec le C), je ne connais personne qui l'emploie en C++. On préfère la notation plus directe :
    class X { };
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/09/2006, 18h41
  2. Réponses: 14
    Dernier message: 15/01/2004, 01h15
  3. Conception d'une classe parente
    Par VincentB dans le forum Langage
    Réponses: 9
    Dernier message: 24/06/2003, 17h28
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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