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 :

"operator =" et dérivation de classe


Sujet :

C++

  1. #21
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 409
    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 409
    Par défaut
    PS: Beaucoup de classes liées à une ressources (ex: les flux) sont à la fois non-copiables et non-assignables. Ce qui me chagrine, c'est que trop souvent elles n'ont pas non plus d'implémentations/spécialisations de swap() alors qu'au niveau code, elles pourraient être swappables...
    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.

  2. #22
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Et c'est là où le concept de "Move" intervient...

  3. #23
    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
    La forme canonique évoquée ici, son nom complet, c'est "forme canonique orthodoxe (de Coplien)", et elle ne s'applique qu'aux classes à sémantique de valeur.
    Reste qu'il faudrait toujours expliciter la copie, même si c'est juste avec un commentaire pour dire "je ne fais rien, mais c'est fait exprès, la copie (/non-copie) par défaut est celle que je veux".

    Au constructeur par défaut près, elle correspond à la règle du Big Three de M.C.Cline (je crois) (FAQ C++ lite). Sur artima, il y a un raffinement de la règle pour la faire tomber à 2, en profitant du RAII pour ne plus avoir à écrire le destructeur.


    Pour en revenir aux questions initiales dès que j'ai une sémantique d'entité, je ne cherche même plus à supporter l'affectation, elle ne sert alors à rien.
    Et dès que j'ai une hiérarchie polymorphe, je considère que je suis dans un cas de sémantique d'entité. Et donc, j'interdis l'affectation qui ne sert à rien.

    Si je veux malgré tout des trucs hybrides, je pars sur des solutions compliquées (qui elles, marchent tout le temps sans tomber sur du slicing ; jouer avec l'opérateur d'affectation comme ce qu'il y avait dans ce fil finit toujours par montrer assez rapidement ses limites), à savoir l'idiome enveloppe-lettre (de Coplien toujours), ou sur des solutions façon Objets Réguliers de S.Parent & A.Stepanov (ils ont un papier qui montre (aussi) comment "régulariser" une entité: Sean Parent. “Beyond Objects”. Understanding The Software We Write. http://stlab.adobe.com/wiki/index.ph..._Presentations . C++ Connections. Nov 2005 ; accessible en passant par les documents non liés sur le wiki)

    Parfois, j'accepte que les entités soient clonables (avec constructeur de copie protégé), mais c'est rare.

    <pub>tout ça a donné un "wizard" pour vim qui demande la sémantique que l'on veut donner à une nouvelle classe</pub>


    PS: les flux 0x seront "déplaçables", mais toujours pas copiables.
    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...

  4. #24
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 409
    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 409
    Par défaut
    Pareil, quand j'ai une sémantique d'entité, je rends mes objets non-assignables, non-copiables par moyens conventionnels, et si je suis gentil je les rends clonables.
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Par défaut
    [HS]
    Pardonnez mon ignorance mais qu'est ce qu'une classe à sémantique de valeur ou d'entité??
    [/HS]

  6. #26
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 409
    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 409
    Par défaut
    On dit d'une classe qu'elle a une sémantique de valeur si deux objets situés à des adresses différentes, mais au contenu identique, sont considérés égaux.
    Des objets d'une classe à sémantique de valeur sont rarement alloués dynamiquement en tant que tels: Ce sont plus souvent des variables membres d'objets alloués dynamiquement, ou des variables locales.
    Les struct du C# ont forcément une sémantique de valeur, ainsi que tous les types valeur de .Net (dont font partie les types dits "primitifs" comme int, float, char...)

    À l'inverse, les classes de .Net ou java ont généralement une sémantique d'entité, mais pas toujours: Une règle simple, c'est que si une classe implémente la méthode equals(), alors elle a une sémantique de valeur.
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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