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 :

Constructeurs et hétitage


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Par défaut Constructeurs et hétitage
    Salut !

    J'ai un problème pour écrire proprement un code.
    J'ai une classe C qui utilise la structure S, mais je dois définir pour cette dernière ses constructeur et destructeur.

    Je me demandais si j'avais le droit de faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct S
    {
        //champs, constructeur et destructeur
    };
     
    class C
    {
        //champs
        S objet1, objet2;
    };
    afin que objet 1 et 2 soient automatiquement construits dans C par le constructeur que j'ai défini dans S ou si je dois dire que C hérite de S, mais dans ce cas, comment se passe les opérations de construction et destruction ?

    Un autre problème est la destruction de S, je voudrais savoir si je peux utiliser la récurrence sur un destructeur, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class S
    {
        S* next;
        S()
        {
            next = 0;
        }
        ~S()
        {
            if (next != 0) delete(next);
            next = 0;
        }
    };
    Je sais que je n'ai pas le droit d'utiliser delete comme ça mais je voulais savoir si je pouvais l'écrire dans ce style, mais avec un autre mot peut-être, ou si je dois définir une fonction effacer récurrente que j'appellerai dans mon destructeur.

    Merci de me répondre même si vois n'avez pas la solution aux 2 problèmes.

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    1er problème:
    Que tu ais défini ou pas un constructeur dans S, les objets 1 et 2 seront construits avec le constructeur par défaut. Pour initialiser les objets 1 et 2 avec un autre constructeur que celui par défaut, je t'invite à consulter ceci : http://c.developpez.com/faq/cpp/?pag...EUR_liste_init
    Plus généralement, lis même cette page : http://c.developpez.com/faq/cpp/?page=constructeur

    2ème problème:
    Drôle de façon de penser la destruction. Je t'invite à consulter http://c.developpez.com/faq/cpp/?page=destructeur . Si tu as d'autres questions par la suite, nous t'y répondrons sans problème.

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    2ème problème:
    C'est tout a fait possible, si tu es sûr que next != this (sinon boucle infinie).
    C'est une façon de faire des listes chainées (même si il y a des conteneurs STL pour cela).

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En effet c'est possible, mais comme l'a dit Ulmo,
    1) il ne faut pas que next==this
    2) il faut bien controler lors de la destruction le passage de noeud en noeud, afin que tu ne te retrouve pas avec un segfault ou autre.

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Par défaut
    Merci pour vos réponses mais je voudrais plus de précisions.

    Citation Envoyé par Alp
    1er problème:
    Que tu ais défini ou pas un constructeur dans S, les objets 1 et 2 seront construits avec le constructeur par défaut
    donc lorsque je vais créer un objet appartenant à la classe C, il va appeler le constructeur de la classe C, mais ne doit-il pas appeler mon constructeur de la classe S pour créer les objets 1 et 2 qui font parti de la classe C ?
    car je ne veux pas utiliser une classe dérivée ici, ce ne serait pas logique par rapport à la classe que je veux définir.

    Remarque : Aurais-je pu définir aussi des méthodes dans la classe S pour les utiliser ensuite en utilisant mon objet de classe C (car ça donnerait une organisation plus logique).

    Citation Envoyé par Ulmo
    2ème problème:
    C'est tout a fait possible, si tu es sûr que next != this (sinon boucle infinie).
    C'est une façon de faire des listes chainées (même si il y a des conteneurs STL pour cela).
    mais est-ce que je dois utiliser delete comme j'ai mis ou est-ce que je peux appeler le destructeur autrement (par exemple next->~S() ) pour que ça marche aussi bien avec delete que free.
    Si je n'utilise pas les conteneurs STL c'est parce que je pense que je ne peux pas ici car en réalité ma structure est plus compliquée puisqu'elle contient 2 pointeurs vers un autre élément de classe S, tous 2 différents (et pas celui d'avant et celui d'après mais 2 éléments indépendants).

    Désolé d'apporter plus de questions à chaque fois mais vos réponses m'intéressent.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par koushkov
    donc lorsque je vais créer un objet appartenant à la classe C, il va appeler le constructeur de la classe C, mais ne doit-il pas appeler mon constructeur de la classe S pour créer les objets 1 et 2 qui font parti de la classe C ?
    Quand on construit un objet, on commence par appeler les constructeurs de ses classes de base, pouis les constructeurs de ses données membre (dans leur ordre de déclaration). Le choix du constructeur à appeler est spécifié dans la liste d'initialisation du constructeur de l'objet. Si rien n'y est spécifié, le constructeur par défaut est appelé. Si l'objet n'a pas de constructeur par défaut, c'est une erreur.

    Citation Envoyé par koushkov
    Remarque : Aurais-je pu définir aussi des méthodes dans la classe S pour les utiliser ensuite en utilisant mon objet de classe C (car ça donnerait une organisation plus logique).
    Tout à fait. La seule différence entre struct est class, c'est que struct est public par défaut, class est private par défaut.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Par défaut
    Ok merci pour ta réponse.

    Il ne me reste plus qu'à savoir comment appeler mon destructeur correctement (pour mon 2ème problème) afin de pouvoir utiliser librement free et delete et je ne vous embêterai plus pour le plus longtemps possible !

    Edit : Je vais mettre mon 2ème problème dans un 2ème post plus clair car je l'ai mal expliqué ici

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par koushkov
    mais est-ce que je dois utiliser delete comme j'ai mis ou est-ce que je peux appeler le destructeur autrement (par exemple next->~S() ) pour que ça marche aussi bien avec delete que free.
    Comme tu fais c'est bien (sous réserve, je me repete, que tu sois sûr que next != this). Je n'ai jamais vu le destructeur appelé explicitement, je soupçonne que ce soit déconseillé voire impossible.

    free ne s'utilise en principe pas en C++, et de toute façon ce n'est pas interchangeable avec delete.

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Appeler directement le destructeur directement est possible, mais à moins de faire des choses avec le placement new, autant faire comme si ce n'étais pas le cas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. [Reflection] Récupérer un constructeur ayant un paramètre int
    Par narmataru dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 09/07/2004, 09h53
  2. [VB6]Déclaration d'un Constructeur Spécialisé
    Par TagadaTsoin dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 26/05/2004, 14h09
  3. [Constructeur]Pb avec la surcharge d un constructeur
    Par cmoulin dans le forum Langage
    Réponses: 3
    Dernier message: 26/04/2004, 09h29
  4. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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