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 :

surcharger l'opérateur >>


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 187
    Points : 73
    Points
    73
    Par défaut surcharger l'opérateur >>
    salut
    comment je peux surcharger l'opérateur >> pour qu'il puisse lire des entiers dans une classe donnée
    merci

  2. #2
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par phenix1988 Voir le message
    salut
    comment je peux surcharger l'opérateur >> pour qu'il puisse lire des entiers dans une classe donnée
    merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MaClasse &operator >>( MaClasse &source, int &entier )
    {
      // blah blah
     
      return source;
    }
    Tu ne dois que remplacer le "// blah blah" avec ton code qui extraire un entier de "source".

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    cynique >> non, ce que tu proposes est faux et ne compile même pas.

    Regardez tous les deux la FAQ, ya la réponse dedans
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    david si tu postes des liens ce sera plus sympa

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    http://cpp.developpez.com/faq/cpp/?p...teur_affichage



    (y'a une fonction recherché dans la faq..)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Goten, c'est bien pour leurs apprendre à utiliser cette fonction que je ne donne pas le lien.

    Il est bien plus bénéfique de chercher par soi même (en sachant que le réponse existe) que de cliquer sur un lien tout donné car ca incite à ne faire aucun efforts de recherche.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    J'ai longuement hésité à le donné... Mais en même temps le fait de tapé operator>> dans un champ de recherche c'est à la portée de tout le monde... et je suis pas sur que ça est un quelconque intérêt pédagogique.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par Goten Voir le message
    J'ai longuement hésité à le donné... Mais en même temps le fait de tapé operator>> dans un champ de recherche c'est à la portée de tout le monde... et je suis pas sur que ça est un quelconque intérêt pédagogique.
    Si, car ca force à chercher et ca montre que la proframmation n'est pas un monde où les solutions viennent toutes seules en cliquant sur un lien.

    Comment fera t'il quand sa solution sera au fond d'un fil sur clc++ s'il ne prend pas l'habitude de chercher dès maintenant ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 16
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    cynique >> non, ce que tu proposes est faux et ne compile même pas.

    Regardez tous les deux la FAQ, ya la réponse dedans
    Ca compile:

    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
    #include <iostream>
    using namespace std;
     
    class MaClasse{};
     
    MaClasse &operator >> ( MaClasse &source, int &entier )
    {
      // blah blah
     
      return source;
    }
     
    MaClasse &operator << ( MaClasse &source, const int &entier )
    {
      // blah blah
     
      return source;
    }
     
    int main () {
     
        MaClasse A;
     
        int b;
     
        A >> b;
        A << b;
     
        return 0;
    }

  10. #10
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Si ca compile c'est car c'est comme surchager l'opérateur virgule et l'opérateur &.
    Exemple:
    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
     
    #include <iostream>
    using namespace std;
     
    class MaClasse{};
     
    MaClasse &operator >> ( MaClasse &source, int &entier )
    {
      // blah blah
     
      return source;
    }
     
    MaClasse &operator << ( MaClasse &source, const int &entier )
    {
      // blah blah
     
      return source;
    }
     
    int main () {
     
        MaClasse A;
     
        int b;
     
        A >> b;
        A << b;
     
        return 0;
    }
    Il n'y a aucune différence sémantique avec ton code, sauf que >> est devenu , et que << est devenu &.

    Si on fait les choses dans les règles, la FAQ est la marche ca suivre.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  11. #11
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    cynique >> non, ce que tu proposes est faux et ne compile même pas.

    Regardez tous les deux la FAQ, ya la réponse dedans
    ça dépend. Mon code marche pour faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      MaClasse a(...);
     
      int un_entier;
      int un_autre_entier;
     
      a >> un_entier >> un_autre_entier;
    Je ne sais pas pourquoi on voudrait faire une telle chose. Peut-être j'ai malcompris la question. C'est possible.

    Et definitivement je ne comprends pas ce que tu dis avec & et ,

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 16
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Si ca compile c'est car c'est comme surchager l'opérateur virgule et l'opérateur &.
    Exemple:
    Est-ce que ça veut dire que ça marche

    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
    58
    59
    60
    61
    62
    63
    #include <iostream>
    using namespace std;
     
    class MaClasse
    {
        public:
            size_t taille_pile;
            int pile[10];
            bool erreur;
     
            MaClasse() : taille_pile(0), erreur(false) {
                ;
            }
            operator bool () {
                return !erreur;
            }
    };
     
    MaClasse &operator >> ( MaClasse &source, int &entier )
    {
        if (source.taille_pile == 0)
        {
            source.erreur = true;
        } else {
            entier = source.pile[source.taille_pile];
            source.taille_pile--;
        }
     
        return source;
    }
     
    MaClasse &operator << ( MaClasse &source, const int &entier )
    {
        if (source.taille_pile == 9)
        {
            source.erreur = true;
        } else {
            source.taille_pile++;
            source.pile[source.taille_pile] = entier;
        }
     
        return source;
    }
     
    int main () {
     
        MaClasse A;
     
        int b;
     
        if (!(A << 32 << 28  << 0 << 12))
        {
            cout << "Erreur lors du chargement de chiffres" << endl;
            return 1;
        }
     
        while (A >> b)
        {
            cout << "Depilage: " << b << endl;
        }
     
        return 0;
    }

  13. #13
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    cynique >> Ce que tu propose est sémantiquement juste (rien n'interdit la compilation après vérification méa culpa) sauf que le modèle canonique est de réserver >> et << pour des flux sur une classe de telle sorte que ta classe soit lisible et que l'on puisse écrire dedans à partir de n'importe quel type de flux, alors que là tu ne la rends opératinel que pour un seul type d'élements.

    Il est plus logique de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::ostream& operator>>(std::ostream& flx, const Maclasse& m)
    {
    flx >> ;//; là je rentre les int et plus si je veux
    return flx;
    }
    que de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Maclasse& operator>>(Maclasse& m, int n)
    {
     // là je rentre que des int
    return m;
    }
    car dès que tu va vouloir rentrer un autre type, ca va être très chiant.

    Et pour mes histoire de operator & et operator , je voulais juste dire que tu pouvais obtenir la même chose en surchargeant & et, à la place de >> et <<, ce ne sont que des opérateurs et autant essayer de les garders avec la syntaxte naturelle, même si ici ce n'est pas encore trop loin.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. [C#] Tri d'objet et surcharge d'opérateur
    Par Royd938 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/12/2007, 00h26
  2. Petit probléme de surcharge d'opérateur .
    Par Clad3 dans le forum C++
    Réponses: 20
    Dernier message: 11/04/2005, 20h15
  3. Problème de surcharge d'opérateurs
    Par Hell dans le forum C++
    Réponses: 17
    Dernier message: 17/01/2005, 16h01
  4. Cumul de surcharges d'opérateurs
    Par Nats dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2004, 13h37
  5. [VB .NET] Surcharge d'opérateur
    Par Franckintosh dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2004, 19h05

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