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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    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 confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 95
    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
    760
    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 : 760
    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.

+ 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