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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    106
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 106
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre �m�rite 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
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    106
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 106
    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
    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