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 :

appel constructeur sans new


Sujet :

C++

  1. #21
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour moi, le mieux est, quand c'est possible, de surcharger l'opérateur '=' et de l'appeler dans le constructeur de copie
    Plutôt l'inverse. Faire une petite recherche sur ce forum, l'opérateur = qui utilise le constructeur par copie est souvent donné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //anti-auto-affectation
    if(&rcSource == this)
    	return *this;
    Voir la FAQ à ce propos, et également le code que je cite ci-dessus.

    On va intégrer une grosse Q/R pour l'opérateur = dans la prochaine MAJ de la FAQ, mais en attendant...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 408
    Par défaut
    Citation Envoyé par Laurent Gomila
    Plutôt l'inverse. Faire une petite recherche sur ce forum, l'opérateur = qui utilise le constructeur par copie est souvent donné.
    ??
    Je n'arrive même pas à voir comment on peut faire cela, puisqu'on n'est pas supposé pouvoir utiliser un constructeur sur un objet existant...

    En trichant sur le fait qu'on puisse quand même ? (placement new, etc.)
    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.

  3. #23
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je parlais de ce genre d'opérateur d'affectation, qui utilise le constructeur par copie pour dupliquer et le destructeur pour... détruire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Classe& Classe::operator =(const Classe& Other)
    {
        Classe Temp(Other); // Copie
     
        Temp.swap(*this); // Echange vieilles <-> nouvelles données
     
        return *this;
    } // destruction des vieilles données avec la destruction de Temp
    Exception-safe, pas de problème d'auto-affectation, .... le blah blah habituel.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 408
    Par défaut
    Ah, OK...
    L'idée même d'une méthode swap() n'était pas encore entrée dans ma tête, donc je ne pouvais pas savoir...

    D'ailleurs, pour moi, cet opérateur d'affectation repose même plus sur la méthode swap() que sur le constructeur de copie...
    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.

  5. #25
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 318
    Par défaut
    C'est surtout que le test pour prévenir de l'auto-affectation est un contre-idiome qui date du temps où les exceptions n'étaient pas comprises -- et où les gens devaient avoir peur des variables temporaires.

    Avec le RAII, cf le raffinement de la règle de 3 qui descend à 2 (le lien est donné dans l'article de FAQ sur le RAII.), il n'est plus obligatoire de définir le destructeur bien qu'il puisse être requis d'expliciter les opérations de copie. De plus, il n'est pas rare de définir le destructeur et d'interdire les opérations de copie.

    Citation Envoyé par kaceda
    Donc apparement le compilo me cree un constructeur par copie par defaut. Et ca marche uniquement parce que ma classe est composé d'objet simple.
    C'est acceptable uniquement si tes données membres ont une sémantique de copie. Il y a un petit côté transitif. Si toutes les données membres d'une classe sont copiables, alors la classe devient implicitement copiable.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #26
    Membre Expert

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Par défaut
    Citation Envoyé par Eusebe
    Loufoque, tu ferais bien de mieux lire les messages avant de poster tes commentaires toujours aussi désagréables sur la forme : je n'ai jamais dis ça...
    +1, c'était encore une brillante intervention de loufoque qui n'a jamais aussi bien porté son nom.
    Tu connais des choses loufoque, alors fais un effort mets en adéquation la connaissance du fond avec de l'intelligence dans la forme sinon...

  7. #27
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    +1, c'était encore une brillante intervention de loufoque qui n'a jamais aussi bien porté son nom.
    Tu connais des choses loufoque, alors fais un effort mets en adéquation la connaissance du fond avec de l'intelligence dans la forme sinon...
    Bon ça va... J'avais mal lu.
    Je fais une connerie une fois et je me prends plein la gueule à ce que je vois.

  8. #28
    Membre Expert

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Par défaut
    Citation Envoyé par loufoque
    Bon ça va... J'avais mal lu.
    Je fais une connerie une fois et je me prends plein la gueule à ce que je vois.
    T'as tout compris...C'est dommage que tu te comportes ainsi je trouve. Ca ne fait pas honneur à ce que tu sais...

Discussions similaires

  1. Réponses: 10
    Dernier message: 24/01/2007, 23h12
  2. Appeler evenement sans passer par gestionnaire
    Par yougize dans le forum Delphi
    Réponses: 3
    Dernier message: 22/01/2007, 15h48
  3. Réponses: 4
    Dernier message: 23/12/2005, 19h35
  4. [Débutant]Constructeur et new/delete
    Par Geolem dans le forum C++
    Réponses: 5
    Dernier message: 02/12/2005, 21h11
  5. Réponses: 5
    Dernier message: 04/11/2004, 15h36

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