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 :

"operator +"


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 35
    Points
    35
    Par défaut "operator +"
    Salut,
    je suis un débutant C++ et je n'arrive pas à écrire la fonction operator+ qui permet l'addition de 2 abr et de créer un autre formé par les mots de 2 abr
    quelles sont les étapes pour écrire cette fonction?
    Merci
    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
    class Noeud
    {
    private:
        string mot;
        Noeud *pGauche;
        Noeud *pDroite;
     
    public:
        Noeud(string word);
        Noeud  * chercher(string un_mot);
    };
     
    class ABR
    {
    private:
        Noeud * pRacine;
        string path;
     
    public :
        ABR();
        ABR(string chemin);//creer un abr avec le contenu du fichier
        ~ABR();
     
        void ajouter(string un_mot);
        friend ABR& operator+(const ABR &x, const ABR& y);
    };
     
    ABR &operator +(const ABR &x, const ABR &y)
    {  
        ...............  
    }

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    - Je ne vois pas l'utilite d'utiliser un friend dans le cas present.
    - Tu n'auras qu'a faire un truc du genre pour retourner un nouvel ABR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ABR *operator +(const ABR &x, const ABR &y)
    {
      return new ABR(x.path + y.path);
    }
    Par contre si tu veux juste ajouter la chaine de caracteres contenue dans un autre ABR, la demarche est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ABR &operator +(const ABR &x)
    {
      path += x.path;
      return *this;
    }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 35
    Points
    35
    Par défaut RE
    lors de la compilation il m'affiche
    " `ABR* ABR::operator+(const ABR&, const ABR&)' must take either zero or one argument "

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par imperio Voir le message
    - Je ne vois pas l'utilite d'utiliser un friend dans le cas present.
    - Tu n'auras qu'a faire un truc du genre pour retourner un nouvel ABR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ABR *operator +(const ABR &x, const ABR &y)
    {
      return new ABR(x.path + y.path);
    }
    L'allocation dynamique ne doit pas être utilisée (ici).

    Citation Envoyé par imperio Voir le message
    Par contre si tu veux juste ajouter la chaine de caracteres contenue dans un autre ABR, la demarche est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ABR &operator +(const ABR &x)
    {
      path += x.path;
      return *this;
    }
    L'operateur + n'a pas le rôle de l'opérateur +=

    Regarder cette entrée de la FAQ pour avoir une signature de l'opérateur + correcte :
    http://cpp.developpez.com/faq/cpp/?p...embre_ou_libre
    (L'opérateur + doit retourner un nouvel ABR)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 35
    Points
    35
    Par défaut RE
    je n'ai pas compris
    comment faut-il faire exactement ?
    je ne peux pas accéder a la fonction ajouter qui se trouver dans la classe ABR

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    As tu lu la FAQ donnée dans le lien ? As tu compris ce que Ehonn expliquait ?
    Quel rapport avec la fonction "ajouter" ?
    Quel est le code appelant ces fonctions ?

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Une remarque qui n'apporte pas de solution, mais qui me parait importante: une fonctionnalité qui fusionne 2 arbres n'a aucune raison de s'appeler "+".

    Une des trois règles de bases concernant les opérateurs, c'est que "chaque fois que la signification d'un opérateur n'est pas manifestement claire et incontestée, il ne doit pas être surchargé."

    Autrement dit, lorsqu'on voit le code arbre1 + arbre2, on ne sait pas clairement et sans ambiguïté quel sera le résultat. Il ne faut donc un opérateur pour cette opération, mais plutôt une fonction du type Fusion( const Arbre &, const Arbre &); ou quelque chose de cet ordre.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  8. #8
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Ce code pourrait exprimer quoi d'autre que la fusion (a contient tous les éléments de b et de c) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ABR a = b + c; // Avec b et c, deux ABRs

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    L'addition de chaque élément pair à pair, par exemple.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Au hasard, la somme de chaque noeud pour un "arbre somme"
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Ok, ça ne m'avait pas traversé l'esprit.
    Mais je ne trouve pas que l'opérateur + soit adapté (à la somme entre les nœuds), un ABR peut stocker n'importe quel type qui a une relation d'ordre (et donc l'opérateur + entre les nœuds n'existe pas obligatoirement).

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 35
    Points
    35
    Par défaut Re
    Mais dans l'énoncé il m'a dit operator + qui permet de concatener 2 arbres binaires de recherche
    Je pense qu'elle est correcte cette question

  13. #13
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Ce n'est pas très important pour ce cas précis (discutable). Mais il faut retenir que si une (seule) personne trouve la surcharge de l'opérateur + ambigüe, il ne faut pas la faire.

    gbdivers a posé quelques questions, il faut lui répondre pour pouvoir avancer

  14. #14
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mohamed11000 Voir le message
    Mais dans l'énoncé il m'a dit operator + qui permet de concatener 2 arbres binaires de recherche
    Je pense qu'elle est correcte cette question
    Ok, c'est bien ce que je craignais: c'est l'énoncé d'un exercice. Dans ce cas oublie ma remarque.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Bonjour

    As tu lu la FAQ donnée dans le lien ? As tu compris ce que Ehonn expliquait ?
    Quel rapport avec la fonction "ajouter" ?
    Quel est le code appelant ces fonctions ?
    j'ai lu la FAQ ce n'est pas mon cas
    la fonction ajouter permet d'ajouter un mot à l'ABR
    la question exacte c'est de redéfinir l’opérateur +

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    L'entrée de FAQ fournie est exactement ce qui répond à ta question.
    Nous ne sommes pas ici pour faire tes exercices à ta place.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  17. #17
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Ok, je crois que l'on va vite clore cette discussion si ça continue...
    J'ai l'impression que tu comprends pas ce que tu fais, ni ce qu'on te dit et que tu ne fais pas d'effort pour comprendre. Il va falloir commencer à montrer que tu fais vraiment des efforts, sinon on va pas perdre du temps avec toi.


    L'entrée de la FAQ te donne l'écriture correcte de l'opérateur +, qui est différente de celle que tu donne. Il faut donc que tu corriges déjà ce point là. Comprends tu la différence entre ces lignes de code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ABR& operator +(const ABR &x, const ABR &y)
    ABR* operator +(const ABR &x, const ABR &y)
    ABR  operator +(const ABR &x, const ABR &y)
    Ensuite, comprends tu l'exercice, en particulier à quoi correspond tes classes et ce que doit faire l'opérateur + ?

    De plus, tu as donné un message d'erreur :
    1. qui ne correspond pas au code que tu avais donné avant (retour d'un pointeur)
    2. dont on n'a pas le code générant cette erreur

    Merci

  18. #18
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Tu peux donner l'énoncé de ton exercice ?

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par exe2bin Voir le message
    Tu peux donner l'énoncé de ton exercice ?
    On se propose de développer la classe ABR qui permet de trier un fichier de mots a travers la création d'un arbre binaire de recherche le fichier contient des mots de taille différente
    1/Constructeur cree un ABr avec le contenu du fichier
    2/Destructeur permet de copier le contenu de l'ABR dans le fichier de telle sorte que son contenu sera trié
    3/Une méthode qui permet d'ajouter un mot a l'ABR
    4/Une méthode qui permet de chercher un mot dans l'ABR
    5/Redéfinir l'operateur + pour la classe ABR l'addition de 2 ABR devra permettre de creer un autre formé par les mots de 2 ABR
    les mots dans l'ABR doivent être distincts

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Comme je l'ai déjà dit, le plus gros conflit est dans le fait que le destructeur enregistre le fichier, ce qui gène les histoires de copies.

    Il faut séparer la classe en deux, avec une classe RAII non-copiable FichierABR qui gère chargement et sauvegarde, et une classe copiable ABR qui gère le vrai contenu et l'opérateur +.

    J'avais commencé à aider l'OP, mais j'ai abandonné suite à l'inanité de sa réponse quand je lui ai dit qu'une fois libéré de ce destructeur on pouvait "rendre la classe copiable".

    Pour tous ceux qui on à souffir sa présence, je posterai le code modifié chez moi quand je serai rentré ce soir.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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