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 union


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut Constructeur de copie et union
    Bonsoir,

    J'ai à utiliser un union dans une classe afin d'éviter à avoir deux classes différentes. Toutefois, je vous demande juste une petite confirmation.

    Imaginons la classe suivante :

    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
    class A
    {
       public:
          A () // Constructeur
          {
          }
     
       private:
          int nimporteQuelleDonnee;
     
          union
          {
              int cas1;
              int cas2;
          };
    };
    Et voici le constructeur de copie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A (const A & a)
    {
       nimporteQuelleDonnee = a.nimporteQuelleDonnee; // Pas de problème ici
     
       cas1 = a.cas1;
    }
    En gros, je voudrais savoir si, lorsque je copie par exemple un objet A utilisant le cas2, si dans ce cas là le nouvel objet aura bien la même valeur dans cas2, malgré le fait que ce soit cas1 = a.cas1 que j'appelle dans le constructeur de copie ?

    Je suis quasiment sûr que ça ne pose pas de problème étant donné qu'il me semble que la mémoire est partagé dans un union, donc si j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    union
    {
        int a;
        int b;
    }
    Si j'écris a = 5, et que j'écirs std::cout << b, ça m'affichera quand même 5. Mais c'est juste pour être sur à 100% :p.

    Merci

  2. #2
    screetch
    Invité(e)
    Par défaut
    ce n'est pas garanti par le standard, et ca parait un peu bancal; les données peuvent etre alignées differemment et ne pas correspondre exactement.

  3. #3
    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
    Un union de plusieurs champs de même type ça n'a aucun intérêt.

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Le standard garantit, que dans une union de structures, si les structures commencent par des champs de même types, on peut toujours accéder à ces champs sans problèmes.

    c-à-d:
    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
    struct A {
      int i;
      ...
    };
     
    struct B {
      int i;
      ...
    };
     
    class C {
      public:
         ...
         union {
             int i;
             A a;
             B b;
         };
    };
     
    int main () {
      C classe;
      classe.a.i = 30;
      cout << classe.i;  // affiche 30
      cout << classe.b.i; // idem
     
      return 0;
    };
    Le code ci-dessus (non-testé) est garanti par le standard de fonctionner.

    Dans ton cas, il n'y a pas de problèmes, mais c'est vrai qu'une union de types identiques ça sert un peu à rien.

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Je sais. En fait c'est surtout pour le "pratique" de la chose, parce que les deux "champs" n'ont pas la même visé (dans un cas, c'est l'identifiant d'un triangle, dans l'autre, l'identifiant d'un autre nœud d'un arbre)... C'est juste beaucoup plus clair.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Et deux variable distinctes avec un nom explicite pour leur fonction c'est pas plus claire ?

  7. #7
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Possible, mais il peut y avoir potentiellement énormément d'objets de ce type, donc si je peux économiser un peu de mémoire :p. Mais je ferai un test, si ça ne m'apporte rien je virerai l'union, c'est vrai que c'est plus simple .

Discussions similaires

  1. [résolu]les constructeurs de copie
    Par pouss dans le forum Langage
    Réponses: 9
    Dernier message: 28/06/2005, 10h57
  2. Réponses: 3
    Dernier message: 24/04/2005, 14h19
  3. [C++]Heritage et constructeur de copie
    Par matazz dans le forum C++
    Réponses: 2
    Dernier message: 25/03/2005, 12h31
  4. Constructeur de copie modifiant le paramètre ?
    Par Nicodemus dans le forum C++
    Réponses: 4
    Dernier message: 12/01/2005, 21h25
  5. Constructeur de copie et Template: Transtypage
    Par ikkyu_os dans le forum Langage
    Réponses: 9
    Dernier message: 26/12/2004, 22h29

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