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 :

aide pour constructeur destructeur


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 106
    Points : 74
    Points
    74
    Par défaut aide pour constructeur destructeur
    bonjour !
    Cher messieurs les experts ; debutant besoin d'aide dans l'etude des classes et classes derriver où l'on trouve le constructeur et le destructeur par defaut mais si je defini un constructeur utilisateur le compilateur appel plusieur fois le constructeur et le destructeur voici un exemple :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <stdio.h>
    #include <windows.h>
     
    class A
    {
        int j;
    public:
        A(void);       // constructeur par defaut
        A(int);        // constructeur utilisateur
        ~A(void);      // destructeur
    };
     
    A::A(void)      // constructeur par defaut
    {
        return ;
    }
     
    A::A(int i)    // Définition du constructeur utilisateur
    {
        j=i;
        printf("Exécution du constructeur de A.\n");
        return;
    }
     
    A::~A(void)    // Définition du destructeur
    {
        printf("Exécution du destructeur de A.\n");
        return;
    }
     
    class B : public A   // class derriver
    {
    public:
        B(void);
        ~B(void);
    };
     
    B::B(void) : A(0)  // Définition du constructeur utilisateur
    {
    printf("Exécution du constructeur de B.\n");
        return;
    }
     
    B::~B(void)      // Définition du destructeur
    {
      printf("Exécution du destructeur de B.\n");
        return;
    }
     
    main()
    {
       A a;
       A::A(1);
       a.A::~A();
       B b;
       B::B();
       b.B::~B();
       system("pause");
     }
    l'affichage
    Exécution du constructeur de A.
    Exécution du destructeur de A.
    Exécution du destructeur de A.
    Exécution du constructeur de A.
    Exécution du constructeur de B.
    Exécution du constructeur de A.
    Exécution du constructeur de B.
    Exécution du destructeur de B.
    Exécution du destructeur de A.
    Exécution du destructeur de B.
    Exécution du destructeur de A.
    le compilateur appel plusieur fois les fonction du constructeur et destructeur ,
    comment je peut rectifier ça svp ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Tu ne dois pas appeler explicitement le destructeur
    Tes appels explicites au constructeur ne font pas ce que tu crois.
    Et puis, quand on affiche les appels au constructeur, il faut afficher aussi ceux au constructeur par défaut (s'il y en a un) et au constructeur de copie...

  3. #3
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Je rajouterais que pour être sur que le destructeur soit bien appellé au bon endroit (pour que l'ordre d'affichage dise quelquechose) tu peut utiliser des blocs de portée de code. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main() {
      {
        A a;
        a.methode();
      }
      {
        B b;
        ...
      }
    }
    A la sortie du bloc marqué en gras, tu est assuré que A soit bien détruit.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 106
    Points : 74
    Points
    74
    Par défaut
    je vous remerci pour les reponses
    à bientot

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par aliwatte Voir le message
    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
    main()
    {
       // Appel du constructeur par defaut pour créer l'objet a
       A a;
     
       // Appel du constructeur avec un int pour créer un objet temporaire (affichage)
       // Destruction imédiate du temporaire par le destructeur (affichage)
       A::A(1);
     
       // Appel manuel du destructeur pour l'objet a (affichage)
       a.A::~A();
     
       // Constructeur par defaut de B pour l'objet b (affichage)
       // Constructeur avec un int de A pour l'objet b (affichage)
       B b;
     
       // Appel du constructeur par defaut pour créer un objet temporaire (affichage)
       // Destruction imédiate du temporaire par le destructeur (affichage)
       B::B();
     
       // Appel manuel du destructeur pour l'objet b (affichage)
       b.B::~B();
     
       system("pause");
     
       // Appel automatique des destructeurs de b (~B et ~A) et a (~A seulement). (fin de portée des variables)
     }
    Donc ce que tu obtiens parait logique. Voilà par contre la véritable sortie de ton programme qui t'a peut-être échappé :

    Citation Envoyé par Console
    Exécution du constructeur de A.
    Exécution du destructeur de A.
    Exécution du destructeur de A.
    Exécution du constructeur de A.
    Exécution du constructeur de B.
    Exécution du constructeur de A.
    Exécution du constructeur de B.
    Exécution du destructeur de B.
    Exécution du destructeur de A.
    Exécution du destructeur de B.
    Excution du destructeur de A.
    Appuyez sur une touche pour continuer...
    Exécution du destructeur de B.
    Exécution du destructeur de A.
    Exécution du destructeur de A.

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/01/2013, 16h25
  2. Réponses: 8
    Dernier message: 14/01/2010, 18h14
  3. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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