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

Langage C++ Discussion :

Constructeurs / Destructeurs / Classes imbriquées


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Par défaut Constructeurs / Destructeurs / Classes imbriquées
    Bonjour à tous.

    J'ai une grosse incertitude concernant l'utilisation de constructeurs et destructeurs dans des classes imbriquées.

    Imaginons 3 classes A, B , C comme suit :

    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
     
     
    class A
    {
        public :
     
    	A()
    	{
     
    	}
     
    };
     
    class B
    {
    	public :
     
    	B(int valeur)
    	{
     
    	}
    };
     
     
    class C
    {
      private :
     
      A instanceA;
      B instanceB;
     
      public :
     
      C()
      {
        instanceA = new A();
        instanceB = new A(55);
      }
     
      ~C()
      {
         delete instanceA;
        delete instanceB;
      }
     
    };
    Je voudrais savoir si l'utilisation de l'opérateur new est correcte pour faire appel aux constructeurs (par défaut et paramétré).

    J'ai vu dans des exemples que le seul fait de faire le code ci-dessous construisait l'instance :

    http://www.tutorialspoint.com/cplusp...destructor.htm

    Enfin d'après ce lien http://www.cplusplus.com/reference/cstdlib/free/

    la fonction free accepte comme paramètre un pointeur, devrais je donc plutôt remplacer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     A instanceA;
     B instanceB;
    par cela ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     A * instanceA;
     B  * instanceB;
    Merci de votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Par défaut
    Bonjour, je croit bien qu'il faut les déclarer dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private :
    A * instanceA;
     B  * instanceB;
    Avec les pointeur.
    Ensuite dans le constructeur de la class C, tu fait :
    A vérifier je suis pas expert mais sous QT je fait comme ça me semble

  3. #3
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Le mieux c'est que tu lises la FAQ C++ http://cpp.developpez.com/faq/cpp/
    Plus particulièrement les chapitres 4, 5, 6 et 10

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Tu peux aussi éviter de passer par des pointeurs en faisant :

    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
    class C
    {
      private :
     
      A instanceA;
      B instanceB;
     
      public :
     
      C()
      : /* instanceA(), // <-- Ne sert à rien, le constructeur par défaut sera appelé par défaut. */
        instanceB(55)
      {
      }
    //...
    };
    Et ensuite tu peux instancier comme ceci ta classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClasseC objetC;
    //ClasseC objetC();  <-- Pas bon car le compilateur confondra ta déclaration par défaut et l'entête d'une fonction.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Par défaut
    Donc pour résumer :

    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
    61
    62
    63
    64
    65
    66
     
     
    class A
    {
        public :
     
    	A()
    	{
               printf("naissance de A");
    	   printf("\n");
    	}
     
    	~A()
    	{
    	   printf("mort de A");
    	   printf("\n");
    	}
     
    };
     
    class B
    {
    	public :
     
    	B(int valeur)
    	{ 
               printf("naissance de B avec ");
    	   printf("%d", valeur);
    	   printf("\n");
    	}
     
    	~B()
    	{
    	   printf("mort de B");
    	   printf("\n");
    	}
    };
     
    class C
    {
      private :
     
      A * instanceA;
      B * instanceB;
     
      public :
     
      C()
      {
            printf("naissance de C");
    	printf("\n");
     
        instanceA = new A;
        instanceB= new B(55);
      }
     
      ~C()
      {
         delete instanceA;
         delete instanceB;
     
    	 printf("mort de C");
    	 printf("\n");
      }
     
    };
    Avec comme main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    int main(int argc, char* argv[])
    {
    	 C objetC;
     
    	 return 0;
    }

    Ce qui donne :


    naissance de C
    naissance de A
    naissance de B avec 55
    mort de A
    mort de B
    mort de C
    j'étais franchement pas certain de l'utilisation du "new".

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

Discussions similaires

  1. blocks et classe constructeur/destructeur
    Par debutant100 dans le forum Général Python
    Réponses: 7
    Dernier message: 09/08/2011, 20h27
  2. Réponses: 11
    Dernier message: 23/07/2009, 10h29
  3. Classe imbriquée et son constructeur
    Par toninlg dans le forum C++
    Réponses: 7
    Dernier message: 30/09/2006, 06h21
  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: 7
    Dernier message: 15/07/2005, 15h07

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