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 code


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut probleme de code
    Bonjour à tous voila j'ai une classe CSetInt qui permet de gérér des int.

    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
    #ifndef CSETINT_H 
    #define CSETINT_H
    #include <string>
     
    class CSetInt
    {
        public:
            CSetInt();// constructeur par défaut (inutilisé)
            CSetInt(size_t dSize);// constructeur réellement utilisé 
            ~CSetInt(); //destructeur 
    		CSetInt(const CSetInt&);//constructeur par copie
            const std::string& error() const;// pour savoir ce qui a pu foirer
            bool addInteger();// pour ajouter un entier 
            size_t maxSize() const;// pour connaitre le nombre maximal d'entier attendu 
            size_t count() const;// pour connaitre le nombre d'eniters déjà introduits:cardinal
            void affiche() const;// pour afficher les entiers introduits  
            bool existe(int dSearch) const;// pour savoir si un entier se trouve deja dans le tableau 
    		//les fonctions membres const ne peuvent pas modifier les variables membres de la classe
     
    		//ajout de opérateurs < et []
    		bool operator < (const int &dNbr);
    		int operator [] (int dNbr);
     
    		/*size_t corresponds to the integral data type returned by the language operator sizeof */
        protected:
        private:
            int * m_pdTab;
            size_t m_dCurPos;
            size_t m_dSize;
            std::string m_error;	
    };
     
    #endif // CSETINT_H
    je dois surcharger < pour qu'il insere des int dans l'ensemble

    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
    bool CSetInt::operator < (const int &dNbr)
    {
    	if(m_dCurPos == m_dSize)
        {
            m_error="le tableau est plein";
            return false;
        }
        if(existe(dNbr))
        {
            m_error = "le nombre introduit existe deja";
            return false;
        }
        m_pdTab[m_dCurPos] = dNbr;
        ++m_dCurPos;
        m_error = "";
        return true;
    }
    dans le main après déclaration de l'objet oEnsemble, initialisé correctement...
    je veux inserer les 3 nombre suivants et je mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oEnsemble1 < 24 < 35 < 45;
    en allant regarder ce qui est intoduit il n'y a que le 24, je ne comprends pas, peut etre que j'ai mal implemente l'operateur...merci de votre aide

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Tu t'es trompe d'operateur, c'est "operator <<" ("<", c'est le test d'inferiorite!).
    Au sujet de ta classe, sais-tu qu'il existe std::set?

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    L'opérateur doit retourner une référence vers l'objet au lieu de retourner un bool.
    Si tu veux donner une erreur quand le tableau est plein, il faudra que tu lances une exception.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut
    c'est bien < et non <<
    1 peit extrait de ce qui m'est demande
    ...l’opérateur < permettant d’ajouter un entier à un objet de la class CSetInt. Par exemple :

    OSet < 10 < 20 < 30
    ;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut
    Au sujet de ta classe, sais-tu qu'il existe std::set?
    peux tu m'en dire stp plus? merci

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par coold Voir le message
    c'est bien < et non <<
    Je me doute. Ce que je voulais te dire, c'est que ce n'est pas naturel. C'est comme surcharger "==" pour faire le modulo, "=" pour l'incrementation, "++" pour l'egalite, etc...

    Pour std::set:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef std::set<int> CSetInt;
     
    CSetInt.insert(5);
    CSetInt.insert(7);
    CSetInt.insert(5); // sans effet
     
    int nb = CSetInt.size(); // renvoie 2
     
    if( CSetInt.find(5) != CSetInt.end() )
    {
        // 5 est bien present
    }
    http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx

  7. #7
    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
    coold : Je te préviens tout de suite, ton prof est un naze.
    Il n'est pas interdit mais extrêmement fortement déconseillé de changer la sémantique des différents opérateurs. Comme la dit Aurelien.Regat-Barrel, si on surcharge des opérateurs, c'est pour simplifier les expressions de telle sorte qu'elles soit plus "naturelles". Ici en utilisant < à la place de << c'est un non sens et j'irais même jusqu'à dire de l'obfuscation.
    "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)

  8. #8
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    dans ton cas, ça ferait:

    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
    CSetInt & CSetInt::operator < (const int &dNbr)
    {
        if(m_dCurPos == m_dSize)
        {
            m_error="le tableau est plein";
            return *this;
        }
        if(existe(dNbr))
        {
            m_error = "le nombre introduit existe deja";
            return *this;
        }
        m_pdTab[m_dCurPos] = dNbr;
        ++m_dCurPos;
        m_error = "";
        return *this;
    }
    Mais comme l'a souligné Médinoc, tu peux avoir envie d'utiliser les exceptions pour gérer les erreurs.


    Si jamais tu retournais un bool, alors les opérations après la première insertion avec le '<' seraient des comparaisons d'entiers/bool, qui n'auraient aucun effet.

    Enfin, l'opérateur << est destiné au décalage de bits, ça m'a fait bizarre la première fois que je l'ai vu utilisé pour les flux ^^

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Enfin, l'opérateur << est destiné au décalage de bits, ça m'a fait bizarre la première fois que je l'ai vu utilisé pour les flux ^^
    Je crois que de nos jours, on peut dire que l'opérateur << sert à envoyer un objet dans un autre, l'utilisation << comme décalage de bits n'étant qu'une surcharge étrange que quelqu'un qui ne connaissait pas les règles de bonne conduite pour une surcharge a décidé d'utiliser...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut
    merci pour toutes vos commentaires et réactions ; la surcharge de l'opérateur < est un cas d'école, qui ici n'a pas beuacoup de sens. Le prof nous a bien prévenu. mais voila c'est un exercice d'école. merci encore des précisions

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gao,
    Citation Envoyé par JolyLoic Voir le message
    Je crois que de nos jours, on peut dire que l'opérateur << sert à envoyer un objet dans un autre, l'utilisation << comme décalage de bits n'étant qu'une surcharge étrange que quelqu'un qui ne connaissait pas les règles de bonne conduite pour une surcharge a décidé d'utiliser...
    Il manque la balise [HUMOUR]
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    coold : Je te préviens tout de suite, ton prof est un naze.
    Il n'est pas interdit mais extrêmement fortement déconseillé de changer la sémantique des différents opérateurs.
    C'est sûr que tu es bien placé pour juger du contenu pédagogique d'un cours sur la simple lecture d'un morceau d'un énoncé d'un TP. Je donne moi-même ce conseil en classe que je répète plusieurs fois, reste que ce n'est pas plus grave dans un cours de présenter ça. Avant de porter ce genre de jugement, fais tes preuves. Visiblement le prof avait pris les précautions nécessaires en avertissant que c'était un cas d'école. Donc maintenant, on se demande qui est le « naze ».

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Tiens, au passage: Il semblerait que tu aies maintenant appris à redéfinir les opérateurs. Tu vas donc pouvoir donner à ta classe un opérateur = pour éviter de planter après une copie malheureuse...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut
    C'est sûr que tu es bien placé pour juger du contenu pédagogique d'un cours sur la simple lecture d'un morceau d'un énoncé d'un TP. Je donne moi-même ce conseil en classe que je répète plusieurs fois, reste que ce n'est pas plus grave dans un cours de présenter ça. Avant de porter ce genre de jugement, fais tes preuves. Visiblement le prof avait pris les précautions nécessaires en avertissant que c'était un cas d'école. Donc maintenant, on se demande qui est le « naze ».
    Voila qui est bien dit, no coment!!!

    Tiens, au passage: Il semblerait que tu aies maintenant appris à redéfinir les opérateurs. Tu vas donc pouvoir donner à ta classe un opérateur = pour éviter de planter après une copie malheureuse...
    Médinoc, la progression de mon cours est tel que je ne pouvais pas en ce moment introduire des opérateurs parce que c'est 1 point de théorie qui n'était pas encore abordé, maintenat oui; donc voila. Autrement je trouve tes remarques très pertinentes et bien avisées merci pour cela et parlant de ramarque
    celle-ci n'est pas bien claire dans ma petite tête
    L'opérateur doit retourner une référence vers l'objet au lieu de retourner un bool.
    Si tu veux donner une erreur quand le tableau est plein, il faudra que tu lances une exception.

  15. #15
    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
    Ce n'est pas par ce qu'on est en TP que l'on doit donner de mauvaises habitudes. L'opérateur pour envoyer des messages dans un objet c'est << pas <, qui lui est l'opérateur d'inégalité strict. Comme je le répète, le but de la surcharge des opérateurs, c'est de pouvoir utiliser "de façon naturelle" les objets bien qu'ici il est vrai que la différences est minime mais quand même notable.
    "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)

  16. #16
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Visiblement le prof avait pris les précautions nécessaires en avertissant que c'était un cas d'école.
    Ce que je ne vois pas, c'est quelle raison il pourrait avoir pour, même dans un cas d'école, préférer < à <<. Utiliser l'un ou l'autre demande exactement les mêmes connaissances préalables, et utiliser l'un est bien plus idiomatique qu'utiliser l'autre.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. probleme de code
    Par fixouille90 dans le forum Access
    Réponses: 11
    Dernier message: 09/12/2005, 15h23
  2. probleme de code simple
    Par BFH dans le forum C
    Réponses: 18
    Dernier message: 28/10/2005, 18h57
  3. [VB.Net] Probleme popup code behind
    Par balibo dans le forum ASP.NET
    Réponses: 19
    Dernier message: 17/10/2005, 12h22
  4. probleme de code formulaire
    Par bachilbouzouk dans le forum ASP
    Réponses: 45
    Dernier message: 13/04/2005, 10h01
  5. [debutant] probleme de code :-(
    Par flogreg dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 16/08/2004, 18h20

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