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 :

modification d'operateur de flux


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Points : 76
    Points
    76
    Par défaut modification d'operateur de flux
    bonjour à tous,
    je suis en train d'apprendre la poo en faisant un programme qui manipule des fractions, je voudrais modifier l’opérateur << pour qu'il affiche les fractions sous la forme a/b sauf que je souhaite rendre privés les attributs numérateur et dénominateur de ma fraction du coup je ne sais pas comment y accéder (enfin j'ai bien quelques idées mais je cherche la "bonne" façon de faire.

    voici mon code:

    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
    class Fraction
    {
    public:
        Fraction(int numerateur, int denominateur) noexcept;
        void simplification() noexcept;
        double valeur_reelle() const noexcept;
     
    private:
        int m_numerateur;
        int m_denominateur;
     
    };
     
    //constructeur:
    Fraction::Fraction(int numerateur, int denominateur) noexcept
        : m_numerateur(numerateur), m_denominateur(denominateur)
    {
        assert(m_denominateur != 0, "le denominateur ne peut pas valoir 0");
    }
     
    void Fraction::simplification() noexcept
    {
        m_numerateur /= std::gcd(m_numerateur, m_denominateur);
        m_denominateur /= std::gcd(m_numerateur, m_denominateur);
     
    }
     
    double Fraction::valeur_reelle() const noexcept
    {
        return double(m_numerateur) / m_denominateur;
    }
     
    std::ostream& operator <<(std::ostream flux, Fraction f)
    {
        return flux << f.m_numerateur << '/' << f.m_denominateur; // c'est la que ça bloque
    }
     
    int main()
    {
       //mon main
     
    }

  2. #2
    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
    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.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Points : 76
    Points
    76
    Par défaut
    ok du coup si j'ai bien compris ma fonction simplification est un mutateur? par contre je bloque toujours, je ne vois pas comment renvoyer mes deux int sous une forme qui me permet de les utiliser dans mon modificateur de flux.

    j'ai essayé avec un std::pair :
    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
     
    class Fraction
    {
    public:
        Fraction(int numerateur, int denominateur) noexcept;
        std::pair<int, int> get_fraction();
        void simplification() noexcept;
        double valeur_reelle() const noexcept;
     
    private:
        int m_numerateur;
        int m_denominateur;
     
    };
     
    //constructeur:
    Fraction::Fraction(int numerateur, int denominateur) noexcept
        : m_numerateur(numerateur), m_denominateur(denominateur)
    {
        assert(m_denominateur != 0, "le denominateur ne peut pas valoir 0");
    }
    std::pair<int, int> Fraction::get_fraction()
    {
        std::pair<int, int> fraction{ m_numerateur, m_denominateur };
        return fraction;
    }
     
    void Fraction::simplification() noexcept
    {
        m_numerateur /= std::gcd(m_numerateur, m_denominateur);
        m_denominateur /= std::gcd(m_numerateur, m_denominateur);
     
    }
     
    double Fraction::valeur_reelle() const noexcept
    {
        return double(m_numerateur) / m_denominateur;
    }
     
    std::ostream& operator <<(std::ostream flux, Fraction f)
    {
        return flux << f.get_fraction().first << '/' << f.get_fraction().second;
    }
     
    int main()
    {
        SetConsoleOutputCP(CP_UTF8);
        Fraction const f{ 4, 10 };
        std::cout << f;
     
    }
    j'ai essayé en créant une structure dans la classe (en gros j'ai tourné en rond):

    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
    class Fraction
    {
    public:
        Fraction(int numerateur, int denominateur) noexcept;
        struct frac
        {
            int numerateur;
            int denominateur;
        };
     
        frac get_fraction();
        void simplification() noexcept;
        double valeur_reelle() const noexcept;
     
    private:
        int m_numerateur;
        int m_denominateur;
     
    };
     
    //constructeur:
    Fraction::Fraction(int numerateur, int denominateur) noexcept
        : m_numerateur(numerateur), m_denominateur(denominateur)
    {
        assert(m_denominateur != 0, "le denominateur ne peut pas valoir 0");
    }
    Fraction::frac Fraction::get_fraction()
    {
        frac fraction{ m_numerateur, m_denominateur };
        return fraction;
    }
     
    void Fraction::simplification() noexcept
    {
        m_numerateur /= std::gcd(m_numerateur, m_denominateur);
        m_denominateur /= std::gcd(m_numerateur, m_denominateur);
     
    }
     
    double Fraction::valeur_reelle() const noexcept
    {
        return double(m_numerateur) / m_denominateur;
    }
     
    std::ostream& operator <<(std::ostream flux, Fraction f)
    {
        return flux << f.get_fraction().numerateur << '/' << f.get_fraction().denominateur;
    }
     
    int main()
    {
        SetConsoleOutputCP(CP_UTF8);
        Fraction const f{ 4, 10 };
        std::cout << f;
     
    }
    et j'ai toujours la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Erreur (active)	E1776	impossible de faire référence à fonction "std::basic_ostream<_Elem, _Traits>::basic_ostream(const std::basic_ostream<_Elem, _Traits> &) [avec _Elem=char, _Traits=std::char_traits<char>]" (déclaré à la ligne 60 de "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include\ostream") -- fonction supprimée	projet poo 2	C:\Users\aperi\source\repos\projet poo 2\main.cpp	64

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Vas-y fais 1 effort, la surcharge de l'opérateur de flux << se trouve facilement sur internet

    Dans ta classe, il faut mettre friend std::ostream& operator<<(std::ostream&, const Fraction&); (<- note friend, & et const &)

    Et pour l'implémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::ostream& operator <<(std::ostream& os, const Fraction& f) {
        os << f.get_fraction().numerateur << '/' << f.get_fraction().denominateur;
     
        return os;
    }

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par foetus Voir le message
    Vas-y fais 1 effort, la surcharge de l'opérateur de flux << se trouve facilement sur internet
    on y trouve aussi beaucoup de conneries...

    mais merci d'avoir répondu.

  6. #6
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    friend n'est utilisable que si le prototype est déclaré dans la classe, ce n'est pas le cas ici. En réalité, on utilise cette façon essentiellement pour accéder aux champs privés car friend autorise la fonction à y accéder.

    get_fraction devrait être const.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    En réalité, on utilise cette façon essentiellement pour accéder aux champs privés car friend autorise la fonction à y accéder.
    pour les opérateurs, friend contrairement à 1 méthode, sert à ne pas fixer l'ordre des paramètres et pouvoir les intervertir ... et pour le flux, les chaîner.


    Édit : Effectivement, j'ai dit n'importe quoi la notion friend permet juste d'avoir accès à toute la classe avec 1 surcharge avec 1 fonction libre.

  8. #8
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Ça ne change pas qu'une fonction libre fait tout aussi bien l'affaire sans avoir besoin de la mettre en amie. Pas de raison de l'utiliser.

  9. #9
    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
    - la surcharge de << est couverte dans la faq
    - ajouter des accesseurs/getters sur les champs est ici préférable imo
    > vouloir connaître le numérateur ou dénominateur d'une fraction ne me parait pas être aberrant de toute façon
    > friend devient donc superflu et n'a aucun intérêt
    - le chaînage est assuré par le fait que qu'elle retourne le flux et l'interface de la std oblige à ce que ce soit une fonction libre, friend n'a rien à voir ici
    - get_fraction doit être const
    - une pair suffit, ta structure interne est superflue
    > les champs d'une pair sont first & second
    > des accesseurs pour chaque champ seraient encore mieux
    - le flux en paramètre d'un opérateur << est une référence
    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.

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    Points : 76
    Points
    76
    Par défaut
    effectivement pas besoin de friend (je me coucherais quand même moins con ce soir) j'avais oublié de mettre les paramètres de la surcharge en référence

    Citation Envoyé par Bousk Voir le message
    -
    > des accesseurs pour chaque champ seraient encore mieux
    tu veux dire une fonction get_numerateur et une get_denominateur?

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

Discussions similaires

  1. Modification des droits par flux
    Par nina74 dans le forum Développement Sharepoint
    Réponses: 6
    Dernier message: 17/03/2016, 11h56
  2. Je suis bloqué pour faire un operateur de flux
    Par djun1 dans le forum Débuter
    Réponses: 3
    Dernier message: 30/12/2013, 11h40
  3. Réponses: 22
    Dernier message: 17/07/2008, 09h51
  4. Surcharge des operateur de flux
    Par pit88 dans le forum C++
    Réponses: 1
    Dernier message: 25/04/2007, 10h31
  5. surcharge des operateurs de flux
    Par icer dans le forum C++
    Réponses: 6
    Dernier message: 22/02/2006, 09h02

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