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 :

Probleme de surcharge de flux


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Probleme de surcharge de flux
    Dans ma classe Texte, j'ai défini la surcharge d'opérateur de sortie :


    /*********************************************************/
    /* TEXTE.H */
    /*********************************************************/
    /* AUTEUR : Emmanuel Benitez */
    /* CREATION : 28-04-2006 */
    /*********************************************************/
    /*********************************************************/
    /* INCLUDE */
    /*********************************************************/
    #include "Objet.h"
    #include <iostream>
    usingnamespace std;
    #ifndef _TEXTE_H_
    #define _TEXTE_H_
    namespace libbeni{
    /*****************************************************/
    /* Classe Chaine */
    /*****************************************************/
    /* Classe donnant les informations minimums d'un */
    /* objet */
    /*****************************************************/
    class Texte : public Objet {
    protected :
    ///////////////////////
    // Variables membres //
    ///////////////////////
    char *m_pszChaineCaractere; // Chaine de caractere
    /////////////////
    // Information //
    /////////////////
    char *getTexte();
    public :

    /////////////////
    // Construteur //
    /////////////////
    Texte();
    Texte(
    const Texte& texte );
    Texte(
    constchar *pszChaineCaractere, size_t iLongueur = 0, constint iDebut = 0 );
    /////////////////
    // Destructeur //
    /////////////////
    virtual ~Texte();
    ////////////////////
    // Initialisation //
    ////////////////////
    void setTexte(constchar * pszTexte, size_t iLongueur = 0, constint iDebut = 0 );
    ///////////////
    // Operateur //
    ///////////////
    libbeni::Texte & operator=(const Texte& texte);
    libbeni::Texte &
    operator=(constchar * szTexte);
    ////////////////
    // Conversion //
    ////////////////
    static Texte * convertTableau( char *paChainesCaractere[], constint iNbChaines);
    //////////
    // Flux //
    //////////
    friend ostream& operator<<( ostream& os, Texte& texte );
    };
    }
    #endif// _TEXTE_H_
    dans le fichier j'implemante de la manière suivante :


    #include
    "Texte.h"
    usingnamespace libbeni;
    ostream& operator<<( ostream& os, Texte& texte ){
    os << texte.getTexte();
    return os;
    }
    pourquoi me donne-t-il cette erreur?? :


    c:\Workspace\C++\LibBeni\Texte.cpp(80) : error C2248: 'libbeni::Texte::getTexte' : impossible d'accéder à protected membre déclaré(e) dans la classe 'libbeni::Texte'
    -- Java Power :::--> Suck .Net <--

  2. #2
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    "protected" veut dire que l'accés peut se faire soit par les menbres de la classe soit par les classes dérivées.
    Or ici il y a tentative d'accés de l'extérieur.
    Il faut mettre "public".
    Les méthodes qui renvoient des données de la classe, type "get...", doivent être "public".
    Les données auxquelles elles accèdent étant "protected" ou "private".
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour la forme, note aussi que ton opérateur << devrait prendre une référence constante.

  4. #4
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Ou en mettant l'opérateur "<<" dans la classe ça devrait régler le problème en gardant l'attribut "protected".
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par seriousme
    Ou en mettant l'opérateur "<<" dans la classe ça devrait régler le problème en gardant l'attribut "protected".
    Pas spécialement, non.

  6. #6
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Pas spécialement, non.
    Parce que c'est en "friend" déjà et que donc l'accés aux menbres "protected" est permit?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par seriousme
    Parce que c'est en "friend" déjà et que donc l'accés aux menbres "protected" est permit?
    Oui.

  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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par seriousme
    Ou en mettant l'opérateur "<<" dans la classe ça devrait régler le problème en gardant l'attribut "protected".
    Je ne vois pas comment le mettre dans la classe, mais bon...

  9. #9
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    La fonction que tu déclares comme friend (ici operator<< ) est censée être
    déclarée avant d'être déclarée comme friend, mais puisque que tu ne donne pas d'erreur à ce sujet, je suppose qu'elle est déclarée avant......

    De plus, je suppose qu'elle est déclarée dans le même namespace que ta classe (libbeni) or au vue de ton code, elle est définie en dehors du namesapce : d'où l'erreure, Il ne s'agit pas de la même fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ostream& libbeni::operator<<( std::ostream& os, libbeni::Texte& texte );
    est déclarée friend et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ostream& operator<<( std::ostream& os, libbeni::Texte& texte );
    est définie et essaie d'atteindre une méthode protected de la classe libbeni::Texte !
    (J'ai précisé tous les namespaces pour être bien clair )

    De plus, la signature de ton opérateur devrait effectivement être revue pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream& operator<<( ostream& os, const Texte& texte );
    PS : il me semble également de pouvoir intégrer cet opérateur à la classe à moins de faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream& Texte::display(ostream&) const;
    qui serait très désagréable à utiliser !
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  10. #10
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Je ne vois pas comment le mettre dans la classe, mais bon...
    Je veux dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream& Texte::operator<<( ostream& os, Texte& texte )...
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  11. #11
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par seriousme
    Je veux dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream& Texte::operator<<( ostream& os, Texte& texte )...
    t'as déjà essayé de faire un truc comme ça ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  12. #12
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Je suis en train...
    Mais j'ai un problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A{
            int a;
            int b;
            std::ostream & operator << (std::ostream & os,const A &t){
                     os<<t.a<<"   "<<t.b<<endl;
                     return os;
                     }
                     };
    me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    14 C:\DOCUME~1\PROPRI~1\Bureau\main_test.cpp `std::ostream& A::operator<<(std::ostream&, A&)' must take exactly one argument
    Pourquoi ne peut on faire ainsi?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  13. #13
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Parce qu'un opérateur membre de classe a toujours comme première opérande l'objet implicite this. En gros là tu as un opérateur à 3 opérandes.

    Dès que la première opérande n'est pas du type de la classe, tu ne peux pas mettre l'opérateur en tant que membre.

  14. #14
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    OK.
    Bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A{
            int a;
            int b;
    public: A(int n,int m):a(n),b(m){};
            std::ostream & operator << (std::ostream & os){
                     os<<a<<"   "<<b<<endl;
                     return os;
                     }
                     };
    compile...mais dans la main quand j'ajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A myA(1,2);
    cout<<myA;
    j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    25 C:\DOCUME~1\PROPRI~1\Bureau\main_test.cpp no match for 'operator<<' in 'std::cout << myA'
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  15. #15
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    par ce que, dans le cas d'un opérateur binaire, la "première opérande" dont parlait Laurent Gomila est ... celle de gauche !

    essaye (pas tip top comme syntaxe hein )
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  16. #16
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    En effet.

    Sinon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ostream & operator >> (std::ostream & os)
    et
    Sinon comment on fait pour avoir un beau:
    ?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  17. #17
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    on fait une méthode externe ! (c'est à dire ce dont on parle depuis le début dans ce topic
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  18. #18
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    J'ai testé c'est bon.

    Sinon, d'un point de vue théorique, pourquoi ne peut on pas définir l'opérateur "<<" dans une classe directement?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  19. #19
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par seriousme
    J'ai testé c'est bon.

    Sinon, d'un point de vue théorique, pourquoi ne peut on pas définir l'opérateur "<<" dans une classe directement?
    on peut, mais l'opérateur n'est pas un méta-opérateur reservé...

    on peut tout à faire définir un opérateur << qui prendrait une instance de la classe en opérande gauche, comme tout opérateur binaire...

    Le problème vient du fait que l'instance de la classe est opérande droite...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  20. #20
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Donc on est bloqué.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

Discussions similaires

  1. Obtention de i trema probleme de surcharge
    Par samouille666 dans le forum Débuter
    Réponses: 15
    Dernier message: 26/10/2009, 04h30
  2. probleme de surcharge...
    Par le_voisin dans le forum Boost
    Réponses: 5
    Dernier message: 03/03/2009, 17h51
  3. [POO] Probleme de surcharge d'operateur
    Par wawa84 dans le forum C++
    Réponses: 2
    Dernier message: 19/10/2008, 20h52
  4. Probleme de surcharge d'operator<<
    Par Linu6 dans le forum C++
    Réponses: 11
    Dernier message: 14/06/2008, 13h17
  5. probleme de récupérer un flux du Web
    Par taouja dans le forum Services Web
    Réponses: 2
    Dernier message: 12/04/2007, 22h06

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