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 :

construction d'une classe


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut construction d'une classe
    quand on a une classe qui est une agrégation d'autres classes, comment faut-il utiliser les classes qui composent la "grosse" classe. Par des pointeurs ou directement. Par ex:
    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
     
    Classe A
    {
       int a,b;
    };
     
    Classe B
    {
       char c[10];
    };
     
    Classe C1
    {
       A instanceDeA;
       B instanceDeB;
    };
     
    Classe C2
    {
      A* pointeurSurA;
      B* pointeurSurB;
    };
    est préférable d'utiliser la méthode C1 ou la méthode C2?

    De plus, sachant que si on utilise la méthode C2, on doit faire un: comment faire pour créer instanceDeA si l'on utilise la méthode C1?

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Jamais de pointeurs, sauf si tu ne peux pas faire autrement (polymorphisme, recréation du membre pendant la durée de vie de la classe aggrégeante, etc...).

    Dans le premier cas, les objets A et B seront construits automatiquement lors de la création de C1. Tu peux accéder à leur constructeur via les listes d'initialisation, si besoin.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut Re: construction d'une classe
    Citation Envoyé par r0d
    Attention, pas de () dans ce cas!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pointeurSurA=new A;
    pointeurSurA=new A( param1 );
    A() c'est une fonction...

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En fait on peut utiliser les parenthèses pour le constructeur par défaut lorsqu'il s'agit d'une allocation dynamique avec new. Par contre lorsqu'on instancie un objet automatique, là le compilo râle sur les parenthèses vide

  5. #5
    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
    Il ne râle pas (si on ne fait pas grand chose de la variable), il croit juste qu'on lui déclare une fonction.
    D'ailleurs, on peut aussi écrire
    Bon moyen avec les templates de forcer à initialiser à la valeur par défaut même les entiers.

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonsoir,

    Le sujet est "CONSTRUCTION D' UNE CLASSE".

    Vous avez défini les prémisses du problème. Classes par "agrégation" mais non pas classes par "dérivation".

    Dans le cas spécifique d' une classe par "agrégation", il faut prévoir au moins une possibilité d' instancier le ou les agrégats, dans votre classe incluante.

    Qu' il s'agisse de pointeurs ou non , ce n' est qu' une question de sémantique.

    Toutefois l' utilisation contemporaine du C++ , tend à réduire l' utilisation de pointeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Classe C1 
     { 
        A instanceDeA; 
        B instanceDeB; 
     };
    Cette classe C1 me paraît un peu dépouillée. Tout y est privé par défaut... etc...

    Précisez comment vous souhaitez réaliser votre agrégation ( avec ou sans pointeur ) .

    Cordialement.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Points : 83
    Points
    83
    Par défaut
    Je suis d'accord sur

    Qu' il s'agisse de pointeurs ou non , ce n' est qu' une question de sémantique.
    Le choix entre pointeru ou pas se résume à : est ce que les instances de A et B ont exactement la même durée de vie que C, c'est à dire est ce que les relations sont des relations d'aggrégation ou de composition.

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Ok, je n'ai plus le code exact (je l'ai modifié depuis), mais je peux vous donner un exemple:

    J'ai mes 2 classe:
    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
     
    classe C1;
    classe C1
    {
    public:
       int compare(const C1 monC1);
     ...
    };
     
    classe C2
    {
      public:
        void maFonction(const C1 &unC1);
     
      private:
         C1 monC1;
    }
     
    void C2::maFonction(C1 &unC1)
    {
       int toto=monC1.compare(unC1);
       ...
    }
    mon problème est que parfois, le C2::monC1 n'est pas alloué, et je n'arrive pas à comprendre pourquoi.
    Alors, comme je n'ai pas trop le temps, dans ce cas là, j'ai décidé de remplacer mon membre C1 monC1 par C1* monC1, et de faire un new C1() dans le constructeur de C2.
    Visiblement, ce n'est pas la bonne solution...

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Je suis d'accord aussi sur :

    Qu' il s'agisse de pointeurs ou non , ce n' est qu' une question de sémantique.
    L'avantage du pointeur, c'est qu'on peut allouer l'objet A juste au moment ou on en a besoin, et le désallouer après. Ce qui permet d'optimiser la gestion de la mémoire.
    Ce n'est pas parce qu'on a des machines avec beaucoup de mémoire maintenant, qu'on se doit en temps que développeur, de la gaspiller.

    La plupard des gens diront qu'il vaut mieux utiliser une instance et pas un pointeur. C'est uniquement pour éviter de s'embêter à faire des tests pour savoir si le pointeur est alloué ou non. C'est pas pur paresse.

    Moi, je préfère les pointeurs. Après, c'est chacun son choix.

  10. #10
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    mon problème est que parfois, le C2::monC1 n'est pas alloué, et je n'arrive pas à comprendre pourquoi
    C2::monC1 est forcément alloué, qu'est-ce qui te fait dire qu'il ne l'est pas ?

    La plupard des gens diront qu'il vaut mieux utiliser une instance et pas un pointeur. C'est uniquement pour éviter de s'embêter à faire des tests pour savoir si le pointeur est alloué ou non. C'est pas pur paresse.
    La paresse est parfois l'amie du code propre et sain . Evidemment il ne faut pas bannir les pointeurs, mais alors quitte à en utiliser autant en prendre des intelligents.

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    bon, je n'arrive pas à recréer l'erreur (où ma classe n'était pas instanciée). J'avais dû faire une erreur bête.

    merci.

    P.S: ça fait plusieurs fois que j'entends parler de pointeurs intelligents, je vais aller me documenter là-dessus (après le boulot )

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

Discussions similaires

  1. Construction d'un objet dans une classe virtuelle pure
    Par thor55 dans le forum Débuter
    Réponses: 3
    Dernier message: 06/07/2014, 10h57
  2. Construction d'une classe de type SoapClient
    Par Arjuna dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 07/08/2012, 17h02
  3. Réponses: 7
    Dernier message: 25/03/2011, 14h04
  4. Construction d'une classe - Exemple de C++ for Dummies
    Par LittleWhite dans le forum C++
    Réponses: 6
    Dernier message: 01/05/2010, 20h36
  5. Problème de construction d'une classe
    Par AraBorLeg dans le forum Langage
    Réponses: 2
    Dernier message: 05/12/2005, 19h07

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