Salut,
Gérer la copie dans la classe String et l'utiliser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int main(){ String const str=f2(); cout<<static_cast<char const*>(str);
Salut,
Gérer la copie dans la classe String et l'utiliser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int main(){ String const str=f2(); cout<<static_cast<char const*>(str);
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Ok, il nous faut un constructeur par copie.
j'ai d'ailleurs lu à ce propos qu'il faut un constructeur par copie dès que dans le constructeur il y avait l'opérateur new et la présence d'allocation dynamique
Est-ce une bonne règle générale à suivre?
Bonjour,
vous avez déjà un problème au niveau de String::setter(char* donnes) car *data=*donnes ne fait que modifier le premier caractère de data avec le premier caractère de donnes. A priori je pense que vous vouliez intégralement copier la chaine de caractères, non ?
de toute façon il ne fallait pas définir une opération setter mais l'opérateur= car actuellement toute affectation d'un String sera catastrophique car les deux String partageront ensuite le même data
pour la même raison il faut impérativement que vous définissiez le constructeur par copie.
Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )
N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML
Cela va même encore plus loin...
Il existe ce que l'on appelle la forme canonique de Coplien:
Dans le cas où tu as une allocation dynamique effectuée dans le constructeur, tu dois prévoir un total de quatre fonctions particulières:
Mais il faut cependant prendre en compte la sémantique de ton objet.
- Le constructeur lui-même
- Le constructeur par copie
- L'opérateur d'affectation "="
- Le destructeur
Il faudra définir ces quatre fonctions si ton objet a sémantique de valeur (que tu veux pouvoir l'assigner, le comparer, le copier, ...), par contre, il faudra souvent "désactiver" l'opérateur d'affectation et le constructeur par copie (en les déclarant privés sans les définir, ou avec le nouveau spécificateur delete (C++11) ) pour les types ayant sémantique d'entité (les différents noeuds de structures dynamique, par exemple)
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Avec C++11, faut aussi rajouter les constructeurs et operateurs d'affection via rvalue.
J'ai aussi tendance à inclure swap (et move) dans le package de base de toute classe proprement implantée.
Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )
N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML
S'il est vrai que le copy and swap est un idiome régulièrement utilisé, je ne suis pas vraiment sur que le comportement lui-même vaille la peine d'être généralisé en tant que fonction membre "indispensable" (enfin, aussi indispensable que les quatre autre).
Le copy and swap peut parfaitement être implémenté sous une forme proche de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Type & operator=(Type rhs) // copy inside { std::swap(*this.membre1,rhs.membre1); std::swap(*this.membre2,rhs.membre2); /*...*/ return *this; }
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Que se passe-t-il si un de tes membres necessite un swap différent de celui fournit par std (genre pour faire du vol de ressources) ?
Comme on a pas droit à surcharger std::swap, le mieux reste quand meme de se donner un membre swap() et la fonction associée dans le namespace pour que en plus l'ADL la trouve tout seul.
J'ai utilisé std::swap juste pour l'exemple, parce que c'est la solution "la plus simple" à appliquer, par exemple, sur des pointeurs, pour éviter les fuites mémoire
Mais rien ne t'empêche d'utiliser quelque chose d'autre
... De là à généraliser une fonction membre swap, publique ou non, il reste de la marge, non (même si sa présence peut présenter des avantages dans certains cas à évaluer correctement )
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
std::swap ça se spécialise.( j'ai peut être pas compris ta phrase)
http://www.developpez.net/forums/d44...rer-algorithm/
Normalement non. Ouvrir std, c'est jamais une idée génial:
http://www.boost.org/doc/libs/1_42_0...lity/swap.html
http://www.gotw.ca/gotw/068.htm
ça me rassure
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager