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 :

classe et opérateurs


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Par défaut classe et opérateurs
    Bonjour,
    J'aurai besoin d'aide sur un problème de classe qui décrit un chemin. Pour construire cette classe, j'ai utilisé une classe Point pour les coordonnées d'un points.
    Voici alors comment se présente ma classe :
    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
     
    class Chemin {
          private :
                  int n; //nombre de points que l'objet contient
                  Point* T; // tableau qui contient la liste ordonnée des points
                  static int nbdefaut;
                  static bool premier;
     
          public :
     
                 Chemin(int=nbdefaut);
                 static int nombre();
     
                void afficherC() const;
     
                 // constructeur par copie
                 Chemin(const Chemin &);
     
                void DefautPoints(int);
     
                Chemin operator+(const Point &) const;
                Chemin operator--() const;  //celui qui me pose problème
                 };
    Je souhaiterai créer un opérateur qui permet de retirer le dernier point d'un chemin mais qui ne renvoie pas de résultat). Je ne vois pas vraiment comment faire. Voici ma première idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Chemin Chemin::operator--() const {
           Chemin D;
           D=Chemin(n-1);
           int i;
           for(i=0;i<n-1;i++) {
                            D.T[i]=T[i];
                           }
           D.T[n-1]=NULL;
           delete D.T[n-1];
     
            }
    Pourquoi cela ne marche pas.
    Comment faire ?
    Merci d'avance pour votre aide....

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut, et bienvenue sur le forum.

    Déjà, pourquoi travailler avec un Point * et devoir te farcir tous les problèmes liés à la gestion dynamique de la mémoire, alors qu'il serait si facile de travailler avec un std::vector<point> ou n'importe quelle autre collection fournie par le standard

    Ceci étant écrit...

    Typiquement, les opérateur +, +=, +, -=, ++,-- sont des opérateurs applicables à ce que l'on appelle des classes ayant sémantique de valeur.

    Or, un chemin n'a pas cette sémantique de valeur: il a une sémantique d'entité, voire, même de collection: un chemin n'est que la liste des points par lesquels il passe

    Il n'y a donc aucune raison cohérente de vouloir écrire les opérateurs arithmétiques, par contre, il semble intéressant de fournir des fonctions membres qui répondent à un service nécessaire, parmis lesquelles (par exemple):
    • addBegin
    • addEnd
    • insert
    • begin
    • end
    • count
    • ...

    En effet, si tu écrit un opérateur + (qui devrait, d'ailleurs, plutôt etre l'opérateur +=), tu ne peux pas savoir si l'ajout d'un point se fait au début de parcours, en fin de parcours, ou s'il est inséré entre deux points (suite à un oubli ou un changement de dernière minute)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Par défaut
    Merci pour cette réponse. Mais, je débute en C++ et je dois absolument construire l'opérateur --
    Pouvez-vous me dire s'il vous plait comment je dois m'y prendre car ce que j'ai fait ne fonctionne pas...
    Je dois aussi garder le *Point

    Encore merci pour votre aide

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par inforum Voir le message
    Merci pour cette réponse. Mais, je débute en C++ et je dois absolument construire l'opérateur --
    Comme j'ai essayé de te le faire comprendre, l'opérateur -- ne représente rien de valable pour ta classe...

    Dés lors, pourquoi dois tu le construire

    Si c'est "pour faire plaisir au prof", il est peut être intéressant de lui faire remarquer que cet opérateur (comme n'importe quel opérateur arithmétique, d'ailleurs) n'a strictement aucun sens.
    Pouvez-vous me dire s'il vous plait comment je dois m'y prendre car ce que j'ai fait ne fonctionne pas...
    Je dois aussi garder le *Point
    Là aussi, pourquoi

    En effet, la classe vector présente énormément d'avantages par rapport à la gestion manuelle dynamique de la mémoire qu'implique un Point *, tout en étant compatible avec l'utilisation que l'on pourrait avoir d'un Point* en cas de besoin (dont l'un des principaux serait une compatibilité avec le C)

    Si, encore une fois, le but est de "faire plaisir au prof", il faudrait:
    lui préciser que l'utilisation de pointeurs devrait être réservée à un très petit nombre de cas bien particulier, et que leur utilisation dans le cadre de la création d'un tableau dynamique n'en fait pas partie.

    Tu pourrais d'ailleurs l'inciter à regarder cette discussion, dans laquelle on aborde ce que devrait, selon nous, être les formations C et C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Bien qu'ayant lu en diagonal, je pense que les conseils de Koala sont judicieux. De même, le pointeur Point * T doit probablement être mal géré : cf F.A.Q Comment gérer proprement des allocations / désallocations de ressources ? Le RAII ! et le tutoriel de Loïc Joly : Présentation des pointeurs intelligents en C++

    Pour répondre concrètement à ton problème :
    1/ -- ne devrait pas être const car il va modifier l'objet en lui enlevant un élément.
    2/ -- devrait retourner une référence sur this
    3/ Au final, en reprenant ton idée d'un temporaire, cela pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Chemin& Chemin::operator--()
    {
       Chemin d(n-1);
       memcpy(d.T,T,(n-1)*sizeof(T[0]))
       std::swap(*this,d);
       return *this;
    }

Discussions similaires

  1. Opérateur new pour une classe personalisée.
    Par méphistopheles dans le forum C++
    Réponses: 15
    Dernier message: 25/05/2007, 07h26
  2. Classe Interface et Opérateur d'affectation!
    Par Rodrigue dans le forum C++
    Réponses: 6
    Dernier message: 07/02/2007, 14h45
  3. Réponses: 13
    Dernier message: 29/09/2006, 16h10
  4. Opérateur de conversion en dehors d'une classe
    Par kwakanar dans le forum C++
    Réponses: 4
    Dernier message: 08/11/2005, 18h06
  5. Réponses: 11
    Dernier message: 08/07/2005, 14h48

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