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 :

redéfinition de operator/=


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Par défaut redéfinition de operator/=
    bonjour, je voudrais savoir comment redéfinir operator/=.
    Est-ce qu'il est externe, interne?
    Faut-il le mettre en 'friend' dans le .hh?
    Combien de paramètres prend la fonction?Qu'est-ce que ça retourne?
    etc...

    Je ne crois pas qu'il en soit question dans la FAQ.
    Si vous avez des liens internet aussi...

    merci pour toutes les informations que vous pourrez me donner.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Il peut être interne avec un seul argument ou externe avec 2 arguments. le friend peut être utile mais à éviter dans le cas de l'utilisation en externe.
    Ca retourne toujours une référence sur lui-même.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Par défaut
    Ce que tu dis s'applique à tous les opérateurs?

    le friend peut être utile mais à éviter dans le cas de l'utilisation en externe
    J'ai redéfini l'opérateur << comme ça:
    fichier.hh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    friend std::ostream& operator<<(std::ostream& o, Image& im);
    fichier.cc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::ostream& operator<<(std::ostream& o, Image& im) {
    // ...
    }
    C'est la seule manière que j'ai trouvé pour que ça marche. J'ai mis 'friend' alors que d'après ce que j'ai compris, mon operator<< est externe. ou alors le fait de le mettre dans le .hh fais de lui un opérateur interne.
    Je sais plus trop comment faire du coup.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ca marche pour tous les opérateurs. En fait, un opérateur interne, c'est comme un externe avec comme premier argument l'instance de la classe sur laquelle l'opération est appelée.

    operator<< est différent, tu ne peux pas le mettre interne de ta classe image car le premier argument est le flux et non l'image. Et si tu dois le mettre friend, c'est qu'il doit accéder à des données private ou protected. Si tu peux t'en passer, c'est mieux.

    Un opérateur interne est un opérateur déclaré dans ta classe.

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Par défaut
    Pour l'opérateur <<, si j'enlève le mot 'friend' dans le .hh ou si j'enlève la signature de la méthode dans le .hh, ça ne compile plus. J'ai laissé la même chose qu'avant dans le .cc. Je dois changer quoi d'autres?

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    ...
    Le mot-clé friend indique que tu autorise la fonction operator<< à accéder aux sections protected et private de ta classe. Cette solution est à éviter le plus souvent possible, mais si tu ne peux pas, tant pis.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Par défaut
    J'ai écouté et compris ce que tu m'a dis, j'ai enlevé le mot 'friend' car je n'accède a aucune donnée private ou protected.
    Ensuite, j'ai enlevé la signature dans le .hh.
    tu dis que operator<< est un opérateur externe, ensuite qu'un opérateur externe ne se définit pas dans ma classe. Donc j'enlève tout ce qui le concerne dans le .hh (car c'est dans le .hh que j'ai la définition de ma classe). Il ne me reste plus que le code avec ce que dois faire l'opérateur dans le .cc, et là ça ne compile plus (une erreur no match for operator<<...).

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Attention, il faut bien garder un prototype de la fonction dans le .h pour que le compilateur sache qu'il existe

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    En fait, tu mets la déclaration, sans friend, dans le .h, et tu mets l'utilisation dans le .cc (toujours sans friend).

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Par défaut
    donc je met la signature dans le .hh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::ostream& operator<<(std::ostream& o, Image& im);
    et la définition dans le .cc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::ostream& operator<<(std::ostream& o, Image& im) {
         // ...
    }
    et là j'ai l'erreur suivante:
    std::ostream& Projet::Image::operator<<(std::ostream&, Projet::Image&) must take exactly one argument

    pourtant, je doit bine avoir deux arguments, nan?

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La déclaration de la fonction, il faut la sortir de la classe, c'est pas une fonction membre.

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Par défaut
    milles excuses à tous, je n'avais pas pensé/compris qu'on pouvait mettre des trucs dans le .h en dessous de l'accolade final de la classe: '};'
    ça marche mieux, merci beaucoup.

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Par défaut
    du coup je vais faire mon boulet, je vais revenir au sujet premier, à savoir l'opérateur /=.

    Image.hh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Image {
         // ...
    };
    Image& operator/=(Image& im, int& coefficient);
    J'ai décidé de le mettre en externe, donc deux arguments comme on m'a dit.

    Image.cc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Image& operator/=(Image& im, int& coefficient) {
    }
    main.cc
    Quand je compile, j'ai l'erreur suivante:
    no match for 'operator/=' in 'im/=2'

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    L'entier est pris par valeur, pas par référence.
    Ensuite, il faut au moins retourner im dans ton implémentation.

  15. #15
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Par défaut
    Miles, je t'aime...
    merci.

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

Discussions similaires

  1. [operator] Redéfinition d'un Cast
    Par Ticoche dans le forum Windows Forms
    Réponses: 15
    Dernier message: 23/01/2008, 17h10
  2. [MFC] redéfinition de BEGIN_MESSAGE_MAP
    Par SethPech dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/03/2004, 13h59
  3. [JSP] thread ? Message d'avancement des operations en cours
    Par buffyann dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 18/12/2003, 11h39
  4. operation sur des alias
    Par 74160 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/11/2003, 18h19
  5. Réponses: 8
    Dernier message: 21/11/2003, 18h38

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