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 :

Constructeur de copie et données-membres pointeur de classe


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut Constructeur de copie et données-membres pointeur de classe
    Bonjour,

    Voici mon problème.
    Je voudrais savoir comment gérer correctement les constructeurs de copies
    et surcharge d'opérateurs "=" dans le cas suivant :





    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    class HybridFighter : public Path 
            {
            protected :
            SFight* fighter; 
            SMagic* magic1;
     
            public :
            HybridFighter(SFight* fighter,SMagic* magic1)
                   	{ this->fighter=fighter; this->magic1=magic1; }
     
            virtual HybridFighter()
    		{ delete fighter; delete magic1; }
     
            };
     
     
     
    int main()
           {
           SMagic *smagiclife=new SMagiclife(1,0,0,0);
           SMagic *smagicdeath=new SMagicdeath(1,0,0,0);
           SFight *pbowman=new SArchery(15,2,5,3);
           SFight *pwarrior=new SFighter(25,3,5,9);
     
    // Hop un archer + vie
           Path* player1=new SHybridFighter(pbowman,smagiclife); 
     
    // Hop un paladin (guerrier + vie)
           Path* player2=new HybridFighter(pwarrior,smagiclife);
     
    // etc..
     
     
           delete smagiclife; delete smagicdeath etc...
           };


    Quelques précisions :

    Path est une classe abstraite, factorisant tout ce qui est commun à chaque personnage.
    Elle me permet donc de créer n'importe quelle type de personnage (cf les deux exemples du main()).


    SFight et SMagic sont des classes abstraites dont dérivent :

    - pour SFight : SArchery, SFighter, Sh2hFighter ... qui sont instanciables
    - pour SMagic :SMagiclife, SMagicdeath, SMagicsorcery ... qui sont instanciables.

    AUCUNE de ses classes ne comportent de pointeurs sur des types de base ni de classe.


    Le programme SEMBLE marcher comme ceci, même sans constructeur de copie, ni opérateur "="
    (tout est dans le "semble" ... LOL)



    Voici donc mes deux questions :

    - Qui doit gérer le/les constructeur(s) de copie? Les classes dont sont issues mes objets membres -même si ce sont des pointeurs de classes- ?
    (dans ce cas, celui par défaut suffit). Sinon je ne vois pas comment faire.
    C'est cette solution que j'ai choisie.

    - Comment faire pour surcharger l'opérateur "=" (ou faire une méthode clone()), car même chose, je ne peux pas écrire SMagic *truc = new Magic() sans me faire rappeler que SMagic est abstraite.
    Je vais en avoir besoin pour recréer mon objet quand un joueur meurt -entre autres-. Et là ben ...
    c pas gagné.


    Merci beaucoup

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Ta classe a-t-elle vraiment besoin d'une sémantique de copie ? Elle semble plutôt orientée sémantique de référence. J'interdirai donc plutôt la recopie (privé et non défini).

    Et si tu en as vraiment besoin, pars plutôt sur une solution clone avec constructeur de recopie protégé (plutôt que privé & non défini) et opérateur d'affectation privé & non défini.

    Et puis, s'il meurt (change de serveur, est sauvegardé, se polymorphe, ...), c'est plus un état plus ou moins partiel de l'objet que l'object lui même que tu risques de vouloir sérialiser.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut Cool
    Luc : Ca me fait plaisir, tu as compris de suite ce que je voulais faire .

    J'ai pu rajouter les constructeur de copie et les opérateurs "=" et j'ai utilisé la technique "Comment copier un objet polymorphe" de la FAQ.
    Bon constructeurs et operateurs public pour l'instant, je v essayer d'affiner ça un peu plus.

    Donc ça marche, je peux affecter deux combattants sans problèmes.

    Merci encore

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Attention. Ce que la FAQ ne dit pas (dans mes souvenirs) c'est quand on peut ou pas avoir des opérations de recopie.

    Permettre une sémantique de valeur sur une hiérarchie polymorphe est une mauvaise idée. C'est pour cela que je ne te conseille pas d'avoir un constructeur de recopie public et que je te conseille d'interdire l'opérateur d'affectation (=) -- ou alors, il faut se diriger vers l'idiome enveloppe-lettre.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/08/2014, 17h29
  2. Réponses: 4
    Dernier message: 22/11/2013, 10h58
  3. pointeur sur donnée membre
    Par jfouche dans le forum Langage
    Réponses: 10
    Dernier message: 03/01/2010, 09h57
  4. Pointeurs et constructeurs par copie
    Par black-falco dans le forum C++
    Réponses: 5
    Dernier message: 02/01/2008, 17h07
  5. Copie des données d'une table d'une base Interbase 6
    Par Djedjeridoo dans le forum InterBase
    Réponses: 6
    Dernier message: 02/02/2004, 09h39

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