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 :

[Débutant]Surcharge opérateur +


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut [Débutant]Surcharge opérateur +
    Bonjour tout le monde !

    Je n'arrive pas à surcharger mon opérateur +...

    En faite, il faudrait que j'applique l'opérateur + à un objet de Message et à une chaine de caractère...

    J'ai donc ma classe message :
    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
    class message
    {
    	private:
    		enum { n = 10 };
    		static int cpt_id_message; // compteur nombr id déjà utilisé
    		int num_id_message;	// num id du message
    		char *adresse_expediteur;
    		char *adresse_destinataire;
    		bool urgent;
    		bool mess_lu;
    		char *sujet;
    		char *texte;
    	public:
    		message (void);					// constructeur par défaut
    		message (const message & mess);	// constructeur de copie
    		message (int num, char *ad_exp, char *ad_dest, bool urg, bool msg_lu, char *sjt, char *txt);
    		~message (void)	// Destructeur class message
    		{
    			delete []adresse_expediteur;
    			delete []adresse_destinataire;
    			delete []sujet;
    			delete []texte;
    		}
    		message operator+ (char ad_dest);	// surcharge de l'opérateur +
     
    		void affMessage (void);	// afficher le message
    		void encMessage (void);	// entrer le message
    		void checkFormatMsg (char *tmpEnc);	// vérifie la présence d'un " @ "
     
    		void setExpediteur (char *tmpEnc) {
    			adresse_expediteur = new char[strlen(tmpEnc)+1];
    			strcpy(adresse_expediteur,tmpEnc); }
    		void setDestinataire (char *tmpEnc) {
    			adresse_destinataire = new char[strlen(tmpEnc)+1];
    			strcpy(adresse_destinataire,tmpEnc); }
    		char *getDestinataire (void) {
    			return adresse_destinataire; }
    };
    Est-ce que çà c'est juste déjà ou il faut que je mette char *ad_dest ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message operator+ (char ad_dest);   // surcharge de l'opérateur +
    Ma fonction de surcharge est la suivante (est-ce bon ?) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    message message::operator +(char ad_dest)
    {
    	message msg;
    	msg.adresse_destinataire = adresse_destinataire + ad_dest;
    }
    En faite, je dois mettre plusieurs adresses email dans "adresse_destinataire" et je fais çà comme çà dans mon main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char tmpEnc[100];
     
    tmpEnc = tmpEnc + getDestinataire(); setDestinataire(tmpEnc);
    Que dois-je corriger pour que çà aille :

    Merci d'avance car j'avance vraiment à pas de fourmis

  2. #2
    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 : 40
    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
    La version correcte serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    message message::operator +(const char* ad_dest) const
    {
       message msg;
     
       // Allocation de msg.adresse_destinataire, avec tous les tests que cela suppose
     
       // Concaténation des deux messages avec strcat, et tous les tests que cela suppose
     
       return msg;
    }
    Je n'ai pas détaillé le code, qui sera inutilement compliqué alors que ce serait si simple avec des std::string.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char tmpEnc[100];
     
    tmpEnc = tmpEnc + getDestinataire(); setDestinataire(tmpEnc);
    Je ne vois pas d'appel à ton opérateur + ici, il n'y a que de l'addition (incorrecte) de char*.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Je n'ai pas détaillé le code, qui sera inutilement compliqué alors que ce serait si simple avec des std::string.
    J'ai essayé pendant toute la matinée de refaire tout mon programme morceau/morceau avec des strings (en suivant des tas de tutos) et j'avais un nombre incroyable d'erreur. A l'école où je suis, on nous apprend çà que bien plus tard malheureusement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char tmpEnc[100];
     
    tmpEnc = tmpEnc + getDestinataire(); setDestinataire(tmpEnc);
    Je ne vois pas d'appel à ton opérateur + ici, il n'y a que de l'addition (incorrecte) de char*.
    Comment dois-je faire pour faire appel à mon opérateur + ? Dans tout les exemples que je peux trouver dans mon syllabus, livre et autres références, on utilise l'opérateur + avec des chiffres essentiellements.

  4. #4
    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 : 40
    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
    J'ai essayé pendant toute la matinée de refaire tout mon programme morceau/morceau avec des strings (en suivant des tas de tutos) et j'avais un nombre incroyable d'erreur. A l'école où je suis, on nous apprend çà que bien plus tard malheureusement.
    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
    #include <string>
     
    class message
    {
       private:
          std::string adresse_expediteur;
          std::string adresse_destinataire;
          std::string sujet;
          std::string texte;
          ...
     
       public:
          message (void);               // constructeur par défaut
          message (const message & mess);   // constructeur de copie 
          message (int num, const std::string& ad_exp, const std::string& ad_dest, bool urg, bool msg_lu, const std::string& sjt, const std::string& txt);
     
          // destructeur inutile
     
          message operator+ (const std::string& ad_dest) const;   // surcharge de l'opérateur +
     
          void affMessage (void);   // afficher le message
          void encMessage (void);   // entrer le message
          void checkFormatMsg (const std::string& tmpEnc);   // vérifie la présence d'un " @ "
     
          void setExpediteur (const std::string& tmpEnc) {
             adresse_expediteur = tmpEnc; }
          void setDestinataire (const std::string& tmpEnc) {
             adresse_destinataire = tmpEnc; }
          const std::string& getDestinataire (void) {
             return adresse_destinataire; }
    };
     
    message message::operator +(const std::string& ad_dest) const
    {
       return msg(..., adresse_destinataire + ad_dest, ...);
    }
    Et note que tu n'auras pas à gérer les allocations / recopies / affectations / destructions comme tu le faisais (mal) avec des char*, tout est automatique.
    Pour le reste : http://c.developpez.com/faq/cpp/?page=strings

    Comment dois-je faire pour faire appel à mon opérateur + ? Dans tout les exemples que je peux trouver dans mon syllabus, livre et autres références, on utilise l'opérateur + avec des chiffres essentiellements.
    Ton opérateur + prend un objet de type message à gauche et une chaîne à droite. Donc par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    message msg;
    msg = msg + "je_vais@laplage.com";

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Merci Loulou24, je vais prendre la peine de réessayer avec des strings vu que tu as pris la peine de me donner un exemple... Tant pis pour les profs, ce qui compte, c'est que çà fonctionne et se de manière optimal !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Je viens encore t'embêter...

    Existe-t-il une fonction comme strchr (avec des strings) ?

    Voilà ma fonction pour vérifier la présence d'un arobat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void message::checkFormatMsg (const std::string& tmpEnc)
    {
    	int verif = 0;
    	char *result_cmp, arobat='@';
    	result_cmp = strchr(tmpEnc,arobat);
     
    	while(result_cmp == NULL)
    	{
    		cout << "|| !!! L'adresse doit comporter un @ ! Recommencez !\n||=> ";
    		cin >> tmpEnc;
    		result_cmp = strchr(tmpEnc,arobat);
    	}
    }
    Parce que le compilateur il est pas content sur cette fonction Et je ne comprends pas ce qui est expliqué là : Comment déterminer si une chaîne contient une valeur d'un certain type ?

  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 : 40
    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
    Yep, c'est la fonction find.

    Pour ce genre de choses je te conseille d'avoir une doc de référence sous la main :
    http://c.developpez.com/faq/cpp/?page=generalites#GENERALITE_cppdoc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void message::checkFormatMsg (std::string& tmpEnc)
    {
       while(tmpEnc.find('@') == std::string::npos)
       {
          cout << "|| !!! L'adresse doit comporter un @ ! Recommencez !\n||=> ";
          cin >> tmpEnc;
       }
    }
    Et je ne comprends pas ce qui est expliqué là : Comment déterminer si une chaîne contient une valeur d'un certain type ?
    Ca n'a rien à voir avec ton problème, c'est pour déterminer si le contenu d'une chaîne peut être converti en un certain type (flottant, entier, ...).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut Une dernière petite erreur...
    Bon bah voilà, tout est changé... Me reste juste une petite erreur là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    message message::operator +(const std::string& ad_dest) const 
    { 
       return msg(..., adresse_destinataire + ad_dest, ...); 
    }
    A la ligne du return...
    error C2143: syntax error : missing ')' before '...' \dossier1.cpp
    error C2059: syntax error : ')' \dossier1.cpp

  9. #9
    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 : 40
    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
    Mes "..." sont bien sûr à remplacer par les autres paramètres demandés par ce constructeur

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut Et pour finir...
    Citation Envoyé par Loulou24
    Mes "..." sont bien sûr à remplacer par les autres paramètres demandés par ce constructeur
    Lol, sorry

    J'ai résolu l'histoire en faisant un nouveau constructeur juste pour adresse_destinataire (toute façon, devait le faire prochainement).

    Bah une chose... un grand grand merci ! Tout marche impec (pour le moment).

    Y a juste une dernière chose que je voudrais savoir :
    - Toutes ces transformations seront-elles portables sous LINUX/UNIX... ? (iostream et string sont bien sous ces OS ?)
    - Et ou pourrais-je trouver une sorte de MSDN (comme pour visual studio) sur les strings ?

    Merci

  11. #11
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut Re: Et pour finir...
    Citation Envoyé par Geolem
    - Toutes ces transformations seront-elles portables sous LINUX/UNIX... ? (iostream et string sont bien sous ces OS ?)
    oui, iostream et string font partie de la librairie standard, elle ne dépendent pas de l'OS, tu les retrouvera sous linux.

    Citation Envoyé par Geolem
    - Et ou pourrais-je trouver une sorte de MSDN (comme pour visual studio) sur les strings ?
    http://msdn.microsoft.com/library/de...ing_header.asp

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut Merci
    Oki, merci jmv.

    C'était pas nécessaire que çà soit MSDN, mais bon... çà m'aidera déjà pas mal

    Bon bah... je mets ce sujet en résolu.

    Merci

  13. #13
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    j'ai pas du comprendre la question, je croyais que tu cherchais dans la msdn. ben sinon il y a http://www.sgi.com/tech/stl/basic_string.html

  14. #14
    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 : 40
    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
    Y a tous ces liens dans la FAQ C++, cf. le lien que je t'ai donné précédemment.

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

Discussions similaires

  1. Portabilitée : Surcharge opérateur de comparaison
    Par Dimitri_87 dans le forum C++
    Réponses: 11
    Dernier message: 15/12/2006, 16h14
  2. Surcharge opérateur +
    Par nunurs83 dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2006, 09h48
  3. Réponses: 8
    Dernier message: 29/08/2006, 00h56
  4. surcharge opérateur << et >>
    Par Azharis dans le forum Débuter
    Réponses: 11
    Dernier message: 02/11/2005, 21h22
  5. Surcharge opérateurs
    Par ghostdogpr dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2005, 11h51

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