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 :

[POO] Déclaration d'instance avec constructeur dans un autre classe


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [POO] Déclaration d'instance avec constructeur dans un autre classe
    Bonjour,

    J'utilise visual C++ express 2008 comme IDE. J'ai des difficultés à déclarer une instance d'une classe A dans une classe B en utilisant le constructeur de A.

    Je déclare et définit une classe A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class ClassA
    {
    private:
    	int a;
    public:
    	ClassA(int a_init);
    };
     
    ClassA::ClassA(int a_init = 1)
    {
    	a = a_init;
    }
    Pour déclarer une instance de A dans la définition d'une classe B, j'utilise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class ClassB
    {
    	ClassA myClassAinB(2);
    };
    La ligne "ClassA myClassAinB(2);" génére une erreur de compilation:
    error C2059: erreur de syntaxe : 'constant'

    - Le code compile si A n'a pas de constructeur ou un constructeur sans paramètres.
    - "ClassA myClassA(2);" dans le main compile.
    - Le code ne compile pas (même erreur) si je remplace le 2 de myClassAinB(2) par une variable, une constante...

    J'ai recherché sur la faq et google mais je n'ai pas trouvé d'info sur la manière de déclarer une instance avec constructeur dans une autre classe.

    Je pense que cela vient d'une syntaxe particulière que je ne connais pas...

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjour,
    Cette syntaxe n'est pas autorisée en C++.
    Tu ne peut construire "myClassAinB" que dans le constructeur de B:
    De cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class ClassB
    {
      ClassA myClassAinB;
    public:
      ClassB():
        myClassAinB(2)
      {
      }
    };

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci, cela fonctionne de cette manière.

    J'aimerais cependant avoir la définition du constructeur de B en dehors de la déclaration de la classe B. J'ai donc essayé le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class ClassB
    {
    private:
    	ClassA myClassAinB;
    public:
    	ClassB();
    };
     
    ClassB::ClassB()
    {
     myClassAinB(2);
    }
    Mais ce la ne fonctionne pas. La ligne "myClassAinB(2);" pose problème.
    Quelle est la méthode pour appeler le constructeur de A dans la définition du constructeur de B ?

  4. #4
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ClassB::ClassB():
      myClassAinB(2)
    {
    }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci, je vais utiliser ça.

    Pour ma curiosité intellectuelle:
    Y'a-t-il une syntaxe équivalente où l'on met l'initialisation entre les crochets?

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ClassA::ClassA()
    {
    	a = 0;
    }
    peut s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ClassA::ClassA() : a(0)
    {
     
    }
    Dans le même esprit, y'a-t-il un équivalent à la syntaxe que tu proposes?

  6. #6
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Tout d'abord il faut bien comprendre que les deux écriture que tu donnent ont un effet différent (même si il est possible que le compilateur le gère de la même manière, avec l'optimisation)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ClassA::ClassA() : a(0)
    {
    }
    //ici tu construit "a" à partir de 0
     
     
    ClassA::ClassA()
    {
      a = 0;
    }
    //ici "a" est construit avec son constructeur par defaut
    //et ensuite on appel l'opérateur =
    La deuxième méthode est donc moins efficace. Mais la syntaxe existe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ClassB::ClassB()
    {
      myClassAinB = ClassA(2);
    }
    //ici myClassAinB est construit avec son constructeur par defaut
    //(encore faut-il qu'il en ait un)
    //ensuite on crée une ClassA temporaire, en lui passant "2"
    //Enfin on utilise l'operateur = pour le copier dans myClassAinB

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class ClassA
    {
    private:
    	int a;
    public:
    	ClassA(int a_init);
    };
     
    ClassA::ClassA(int a_init = 1)
    {
    	a = a_init;
    }
    Ca passe ça maintenant, c'est pas plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class ClassA
    {
    private:
    	int a;
    public:
    	ClassA(int a_init = 1);
    };
     
    ClassA::ClassA(int a_init)
    {
    	a = a_init;
    }
    ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/11/2014, 15h21
  2. Réponses: 4
    Dernier message: 25/07/2006, 16h30
  3. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  4. compiler avec constante dans un autre fichier
    Par hysah dans le forum C++
    Réponses: 8
    Dernier message: 28/03/2006, 22h57
  5. [Débutant] Créer une instance avec le nom d'une classe
    Par Quetzalcoatl dans le forum Langage
    Réponses: 7
    Dernier message: 23/01/2006, 20h43

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