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 :

Structure et surcharge d'operateur


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Par défaut Structure et surcharge d'operateur
    Bonjours,
    voila j'aimerais crée une sorte de variable la voici :
    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
     
    #include <cstring>
     
    struct SChar
    {
        char* data = "";
     
        void operator+=(const char* chr1) {
            strcat(data, chr1);
        }
    };
     
    using namespace std;
     
    int main()
    {
        SChar lite;
     
        lite += "yoplaux";
     
        return 0;
    }
    Mais a chaque fois que je lance le prog il crashe

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    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 153
    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
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par défaut
    Bousk explique au moins sa faute évidente

    Documentation fonction strtcat


    Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.
    Bigmlb crois-tu que ta destination soit préparée pour copier ta chaîne de caractères?

    ou

    À ne pas oublier: Prévoir un caractère de plus pour le '\0' final

    Pour finir, char* data = ""; me semble suspect: ton compilateur n'a-t-il pas crié très fort avec un warning?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Précisons qu'un littéral de chaine (tel que "truc") est normalement directement inclus dans le code, et jamais recopié.
    Son adresse appartient au segment de code, qui n'est ni la pile, ni le tas, et ne peux pas être modifié.

    "truc" est normalement un char const *.
    Le compilateur devrait donc hurler à l'erreur de conversion.

    L'emplacement de l'affectation est illégal sauf en C++11. (et encore, j'aurais tendance à ne pas l'utiliser dans ce cas précis)

  5. #5
    Membre actif
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Par défaut
    D'accord mais je ne comprend pas trop donc comment faire pour que sa fonctionne
    et oui
    me dit un warning mais on peut en C++11 ^^

  6. #6
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    DAns ta méthode operator+= tu dois allouer ta chaine de caractère de manière à ce qu'elle puisse accepter la concaténation.

    En algo:
    Créer une chaine de la taille de str1+str2+1(pour le \0 à la fin).
    Copier str1 dans ta nouvelle chaine.
    Ajouter str2 dans ta nouvelle chaine.
    Ajouter un \0 à la fin de la nouvelle chaine.

    str1 étant la chaine que tu stock dans ta structure et str2 étant la chaine que tu veux rajouter.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Le plus simple, c'est de garder ça à nullptr plutôt que d'y affecter une chaîne littérale:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class SChar
    {
    	char* data;
    public:
    	SChar() : data(nullptr) {}
    	char const *get() const { return (data != nullptr ? data : ""); }
    };

    Ensuite, il faut maintenir son propre buffer dans la chaîne:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class SChar
    {
    	char* data;
    public:
    	SChar() : data(nullptr) {}
    	SChar(char const *s) : data(s!=nullptr ? new char[strlen(s)+1] : nullptr) {
    		strcpy(data, s);
    	}
    	~SChar() { delete[] data; }
    	char const *get() const { return (data != nullptr ? data : ""); }
    };

    Puis on passe en forme canonique pour gérer la copie et l'affectation (par copie-et-swap), et si C++11 le déplacement:
    Code C++ : 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
    class SChar
    {
    	char* data;
    public:
    	//Constructeurs
    	SChar() : data(nullptr) {}
    	SChar(char const *s) : data(s!=nullptr ? new char[strlen(s)+1] : nullptr) {
    		strcpy(data, s);
    	}
    	//Copie
    	SChar(SChar const &src) : SChar(src.data) { }
    	//Affectation (copy-and-swap naïf)
    	// SChar& operator=( SChar const &src ) { SChar tmp(src); Swap(tmp); return *this; }
    	//Affectation (copy-and-swap optimisé)
    	SChar& operator=( SChar tmp ) { Swap(tmp); return *this; }
    	//Déplacement
    	SChar(SChar &&src) : SChar() { Swap(src); }
    	void Swap(SChar &obj) { char* tmpData=obj.data; obj.data=data; data=tmpData; }
     
    	~SChar() { delete[] data; }
    	char const *get() const { return (data != nullptr ? data : ""); }
    };

    Puis on rajoute la concaténation, d'abord par fonction membre (l'opérateur appellera la fonction).

    Code C++ : 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
    class SChar
    {
    	char* data;
    public:
    	//Constructeurs/destructeur/swap, forme canonique
    	SChar() : data(nullptr) {}
    	SChar(char const *s) : data(s!=nullptr ? new char[strlen(s)+1] : nullptr) { strcpy(data, s); }
    	SChar(SChar const &src) : SChar(src.data) { }
    	SChar& operator=( SChar tmp ) { Swap(tmp); return *this; }
    	SChar(SChar &&src) : SChar() { Swap(src); }
    	void Swap(SChar &obj) { char* tmpData=obj.data; obj.data=data; data=tmpData; }
    	~SChar() { delete[] data; }
     
    	char const *get() const { return (data != nullptr ? data : ""); }
     
    	static SChar concat(SChar const &left, SChar const &right) {
    		if(left.data == nullptr && right.data == nullptr)
    			return SChar();
    		//Il faut allouer la somme des strlen(), +1 pour le caractère nul
    		size_t leftLength = strlen(left.get());
    		size_t rightLength = strlen(right.get());
    		size_t totalLength = leftLength + rightLength;
    		SChar ret;
    		ret.data = new char[totalLength+1];
    		strcpy(ret.data, left.get());
    		strcpy(ret.data+leftLength, right.get());
    		return ret;
    	}
    };

    Puis, on ajoute l'opérateur. Et on le fait (ça, je l'ai appris récemment, avant je ne faisais pas ça) sur le même modèle que l'affectation: Le += n'ajoute pas à l'existant, il fait un + et il swappe, de la même manière que le copy-and-swap naîf:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SChar operator+(SChar const &left, SChar const &right) { return SChar::concat(left, right); }
     
    SChar& operator+=(SChar const &right) {
    	SChar tmp(*this + right);
    	Swap(tmp);
    	return *this;
    }
    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.

  8. #8
    Membre actif
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Par défaut
    Merci,
    Grace a vous sa marche maintenant

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par leternel Voir le message
    Précisons qu'un littéral de chaine (tel que "truc") est normalement directement inclus dans le code, et jamais recopié.
    Son adresse appartient au segment de code, qui n'est ni la pile, ni le tas, et ne peux pas être modifié.
    Je dirais plutôt dans le segment de données, genre dans .rodata ou .bss.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/06/2012, 17h09
  2. Surcharge d operateur ==
    Par flipper203 dans le forum C++
    Réponses: 15
    Dernier message: 05/07/2006, 01h54
  3. [POO] surcharge d'operateur
    Par wamania dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 14h31
  4. surcharge des operateurs de flux
    Par icer dans le forum C++
    Réponses: 6
    Dernier message: 22/02/2006, 09h02
  5. [POO] Surcharge d'opérateurs []
    Par Amnesiak dans le forum Langage
    Réponses: 28
    Dernier message: 11/11/2005, 12h44

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