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 :

question sur l'opérateur new


Sujet :

C++

  1. #21
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par deubelte Voir le message
    Quelle pourrait être une solution? Un renvoie par référence ou par pointeur nefonctionne pas non plus, puisque l'objet qui est pointé (ou dont la référence est le nom) est détruit...
    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);

  2. #22
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    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?

  3. #23
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    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

  4. #24
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par deubelte Voir le message
    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?
    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:
    1. Le constructeur lui-même
    2. Le constructeur par copie
    3. L'opérateur d'affectation "="
    4. Le destructeur
    Mais il faut cependant prendre en compte la sémantique de ton objet.

    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

  5. #25
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    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.

  6. #26
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Citation Envoyé par Joel F Voir le message
    swap (et move)
    je pense comprendre swap (mais je ne partage la nécessite de toujours le définir, on ne fait pas que des tris )

    move quésaco ?
    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

  7. #27
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    je pense comprendre swap (mais je ne partage la nécessite de toujours le définir, on ne fait pas que des tris )
    swap ne sert pas que au tri, il sert aussi à implanter le copy-by-swap.

    Citation Envoyé par bruno_pages Voir le message
    move quésaco ?
    std::move effectue l'echange de ressource au travers de reference sur rvalue.

  8. #28
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Joel F Voir le message
    swap ne sert pas que au tri, il sert aussi à implanter le copy-by-swap.
    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

  9. #29
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    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.

  10. #30
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    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

  11. #31
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Joel F Voir le message
    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.

    std::swap ça se spécialise.( j'ai peut être pas compris ta phrase)

    http://www.developpez.net/forums/d44...rer-algorithm/

  12. #32
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Normalement non. Ouvrir std, c'est jamais une idée génial:

    http://www.boost.org/doc/libs/1_42_0...lity/swap.html

  13. #33
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Joel F Voir le message
    Normalement non. tu n'as pas le droit (dixit le standard) d'ouvrir std pour surcharger des éléments de std.
    std::swap est une Template. Tu peut donc la spécialiser non?
    pourquoi se serait interdit?

  14. #34
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par yan Voir le message
    std::swap est une Template. Tu peut donc la spécialiser non?
    pourquoi se serait interdit?
    j'ai le vague souvenir d'un article de Sutter sur le fait que le standard interdit d'ouvrir std pour y coller des spécialisations.

  15. #35
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Citation Envoyé par Joel F Voir le message
    j'ai le vague souvenir d'un article de Sutter sur le fait que le standard interdit d'ouvrir std pour y coller des spécialisations.
    Il me semble que ce sont les overloads qui sont prohibés, pas les spécialisations.

  16. #36
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968

  17. #37
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par metagoto Voir le message
    Il me semble que ce sont les overloads qui sont prohibés, pas les spécialisations.
    OK

  18. #38
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par metagoto Voir le message
    Il me semble que ce sont les overloads qui sont prohibés, pas les spécialisations.
    Attention, pour une fonction comme swap, il n'y a pas moyen de fournir des spécialisations partielles, juste des surcharges qui sont interdites -- peut-être le point dont Joel se souvenait.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  19. #39
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    yan a le bon lien je pense.
    Citation Envoyé par yan Voir le message
    it's usually a good idea to specialize std::swap() (or provide your own overloaded swap() in another namespace) that's specific to your new type

    H. Sutter

  20. #40
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Attention, pour une fonction comme swap, il n'y a pas moyen de fournir des spécialisations partielles, juste des surcharges qui sont interdites -- peut-être le point dont Joel se souvenait.
    que veut tu dire?

Discussions similaires

  1. Question sur le mot new
    Par heeedi dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 03/08/2009, 11h20
  2. Question sur l'opérateur ::
    Par johnkro dans le forum Langage
    Réponses: 8
    Dernier message: 14/03/2008, 10h13
  3. Questions sur l'opérateur <<
    Par coyotte507 dans le forum C++
    Réponses: 4
    Dernier message: 18/11/2007, 22h54
  4. Question sur String variable = new String( )
    Par beegees dans le forum Langage
    Réponses: 12
    Dernier message: 14/05/2007, 21h38
  5. question sur les opérateurs
    Par isidore dans le forum C++
    Réponses: 10
    Dernier message: 25/02/2005, 18h46

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