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 :

Classe imbriquée et son constructeur


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Classe imbriquée et son constructeur
    Bonjour,
    Si j'ai 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    class String {
    public :
    // constructeurs
    String() : p(0) {}
    String (const char * right) : p(0)
    {reassign(new StringReference(right));}
    ...
     
    private:
    void reassign (StringReference *);
     
    class StringReference {
    public:
    int count;
    char * buffer;
    StringReference(const char * right);
    ....
    }
    StringReference *p;
    }
    void String::StringReference::StringReference(const char *right)
    {
    ...
    }
     
    et que dans le code j'ai la ligne
    string g;
    Cette instruction va créer un objet de type String en appelant le constructeur String(), le constructeur de la classe imbriquée est-il aussi appelé?

    Merci.

  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
    Non. Définir une classe imbriquée ne changera que la portée de celle-ci ; cela n'a rien à voir avec de l'héritage par exemple (ie. la classe englobante ne contiendra pas une instance de la classe imbriquée).

    A part ça, dans ce cas là le constructeur de ta classe imbriquée sera tout de même appelé, mais parce que tu le fais explicitement (tu alloues une instance).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Donc, à chaque création d'un objet de type string, on a uniquement création d'un pointeur p qui ne pointe sur rien ( p(0)), sauf si on a l'instruction suivante :
    puisqu'alors on appelle le constructeur de la classe imbriquée?

  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
    Oui.

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    moi, j'aurais plutôt écrit ceci:

    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
     
    class StringReference {
    public:
    int count;
    char * buffer;
    StringReference(const char * right);
    ....
    };
     
    class String {
    public :
    // constructeurs
    String() : p("abc") {} /*c'est ici que l'on fait appel au constructeur de l'objet membre*/
    String (const char * right) : p("abc") /*idem*/
    {reassign(new StringReference(right));}
    ...
     
    private:
    void reassign (StringReference *);
     
    StringReference *p;
    };
    StringReference::StringReference(const char *right) /*constructeur StringReference*/
    {
    ...
    }
    les constructeurs n'ont pas de type, même pas void.

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    essaye aussi ceci (mais là, je suis moins sur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String (const char * right) : p(right)

  7. #7
    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
    moi, j'aurais plutôt écrit ceci
    essaye aussi ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String (const char * right) : p(right)
    Je ne pense pas que le fait d'ajouter des erreurs de compilation en construisant un StringReference* avec un const char* aide beaucoup. Personnellement, si la fonction reassign est bien faite, je ne vois aucun problème au code original.

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut
    exact, je n'avait pas réalisé qu'il s'agissait d'un pointeur...

Discussions similaires

  1. Instancier une classe sans appeler son constructeur ?
    Par Maitre2B dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/11/2014, 16h38
  2. [C#]Remonter des événements dans des classes imbriquées
    Par Kcirtap dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/12/2013, 12h43
  3. Constructeurs / Destructeurs / Classes imbriquées
    Par XAMLdev dans le forum Langage
    Réponses: 4
    Dernier message: 29/07/2013, 19h55
  4. Intérêt des classes imbriquées ?
    Par elitost dans le forum Langage
    Réponses: 5
    Dernier message: 21/10/2005, 09h30
  5. Réponses: 13
    Dernier message: 02/02/2005, 00h21

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