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 :

Problème de déclaration statique


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut Problème de déclaration statique
    Bonjour,
    Quelqu'un pourrait-il m'éclairer sur le point suivant. J'ai une classe (CToto)dont le constructeur prend un paramètre. Je souhaite utiliser cette classe dans une autre (CAutre) classe, j'essaye de déclarer une variable membre dans le .h de CAutre et cela ne fonctionne pas. Pourquoi?
    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 CToto
    {
        CToto(bool btest);
        ~CToto();
        .....
    }
    
    dans Autre.h
    
    class CAutre
    {
        ....
       CToto m_Toto(true);    //Incorrect Pourquoi?
       ....
    }

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Parce que CToto n'est pas déclaré dans cette classe ? http://c.developpez.com/faq/cpp/?pag...erence_croisee

  3. #3
    Membre émérite Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Par défaut
    inclue la classe dont tu as besoin!!

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Ou parce que tu essaie d'initialiser une variable membre dans la déclaration de la classe ?

    L'erreur rencontrée (message du compilo, du linker, crash à l'exécution, etc...) pourrait nous aider à t'aider...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    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
    14
    15
    16
    17
    18
    class CToto
    {
        CToto(bool btest);
        ~CToto();
        .....
    }
    
    dans Autre.h
    
    #include "Toto.h"
    ....
    class CAutre
    {
        ....
       CToto m_Toto(true);    //Incorrect Pourquoi?
       ....
    }
    [/QUOTE]

    Petite erreur de ma part lorsque j'ai rédigé le message. "Toto.h" est bein inclut dans "Autre.h"
    L'erreur que je rencontre est la suivante:
    error C2059: syntax error : 'constant'
    Si je défini le construteur de CToto avec un paramètre par défaut cela fonctionne, mais évidement cela ne m'arrange pas!

    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
     
    class CToto
    {
        CToto(bool btest=true);
        ~CToto();
        .....
    }
     
    dans Autre.h
     
    #include "Toto.h"
    ....
    class CAutre
    {
        ....
       CToto m_Toto;   
       ....
    }
    [/QUOTE]

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Il faut que tu initialises tes données membre dans le constructeur de la classe, et pas dans sa déclaration !

    Donc dans ton Autre.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "Toto.h"
    ....
    class CAutre
    {
       ...
       CAutre();
        ....
       CToto m_Toto;   
       ....
    }
    et dans Autre.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CAutre::CAutre():m_Toto(true)
    {}

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Initialise ton m_toto dans tous tes constructeurs de CAutres.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut
    Il y a des solutions, je suis bien d'accord. Mais ce que je ne comprend pas c'est pourquoi ce code ne fonctionne pas? Je veux utiliser ma classe CToto de deux manières différentes, quel est le problème à passer un paramètre lorsque je déclare une variable membre dans le .H. Si je fais la même opération dans autre.cpp je n'ai pas le problème si ce n'est que la visibilité de la variable est limitée à la fonction membre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CAutre::fct()
    {
       ....
       CToto toto(true); // correct
       ....
    }
    Le même problème est présent si j'essaye d'initialise une variable de type CString (en considérant que j'ai les includes nécessaires)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dans autre.h
       ....
       CString m_Str(_T("Bonjour")); //Incorrect
       ....

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par alen
    Il y a des solutions, je suis bien d'accord. Mais ce que je ne comprend pas c'est pourquoi ce code ne fonctionne pas? Je veux utiliser ma classe CToto de deux manières différentes, quel est le problème à passer un paramètre lorsque je déclare une variable membre dans le .H. Si je fais la même opération dans autre.cpp je n'ai pas le problème si ce n'est que la visibilité de la variable est limitée à la fonction membre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CAutre::fct()
    {
       ....
       CToto toto(true); // correct
       ....
    }
    Le même problème est présent si j'essaye d'initialise une variable de type CString (en considérant que j'ai les includes nécessaires)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dans autre.h
       ....
       CString m_Str(_T("Bonjour")); //Incorrect
       ....
    De manière générale, ne mets pas de valeurs dans la déclaration des variables et utilise la liste d'initialisation comme Eusebe et Luc te le disent.

  10. #10
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    Avant la création d'un objet le système doit créer tous les membres. A ce moment seul le constructeur par défaut est appelé.
    Si la classe de la donnée membre ne fournit pas de constructeur par défaut ou si on désire appeler explicitement un constructeur paramétré il faut le faire à travers de la liste d'initialisation du constructeur.
    Cette liste est donc utilisée avant la création proprement dite de la classe englobante.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut
    Citation Envoyé par gelam
    Avant la création d'un objet le système doit créer tous les membres. A ce moment seul le constructeur par défaut est appelé.
    Construteur par défaut qui n'existe pas dans la classe CToto d'ou l'erreur.

    Citation Envoyé par gelam
    Si la classe de la donnée membre ne fournit pas de constructeur par défaut ou si on désire appeler explicitement un constructeur paramétré il faut le faire à travers de la liste d'initialisation du constructeur.
    Cette liste est donc utilisée avant la création proprement dite de la classe englobante.
    Typiquement ce que je veux réaliser ou tout du moins comprendre pourrais-tu expliciter d'avantage?
    Merci

  12. #12
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    Lorsque tu écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class CToto
    {
        CToto(bool btest);
        ~CToto();
        .....
    }
    Tu décide qu'il n'est pas possible de créer un objet CToto sans fournir de valeur. Il n'est donc pas permis d'écrire
    Lorsque tu crée un classe qui contient un CToto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class CAutre
    {
       ...
       CAutre();
        ....
       CToto m_Toto;   
       ....
    }
    Le système doit créer un CToto pour pouvoir créer un CAutre. Lors de cette création seul le constructeur par défaut (sans paramètre) est appelé. Mais CToto n'en dispose pas --> Erreur de compilation.

    La liste d'initialisation est utilisée par le compilateur pour fournir le paramètre lors de la construction de la donnée menbre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class CAutre
    {
       ...
       CAutre() : m_Toto(true){}
        ....
       CToto m_Toto;   
       ....
    }
    Ceci est la seule solution pour pouvoir choisir un constructeur paramétré pour une donnée membre.

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par gelam
    Lorsque tu écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class CToto
    {
        CToto(bool btest);
        ~CToto();
        .....
    }
    Tu décide qu'il n'est pas possible de créer un objet CToto sans fournir de valeur. Il n'est donc pas permis d'écrire
    Ben si, on a le droit. La différence est que chaque variable membre sera elle aussi initialisée avec son constructeur par défaut.

  14. #14
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Miles
    Ben si, on a le droit. La différence est que chaque variable membre sera elle aussi initialisée avec son constructeur par défaut.
    Si on définit un constructeur, le constructeur par défaut n'est plus défini implicitement.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut
    Merci à tous, je suis un peu moins ignorant

  16. #16
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    Lorsqu'on écrit un constructeur le système de synthétise pas de constructeur trivial qui est un constructeur par défaut.
    Si on écrit
    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 CToto
    {
    public:
        CToto(bool btest){ x=btest; }
        ~CToto(){}
    private:
    	bool x ;
    } ;
     
    int main()
    {
    	CToto toto ;
     
    	return 0 ;
    }
    Le compilateur génère une erreur du type :
    error C2512: 'CToto' : no appropriate default constructor available

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut
    Un lien interressant parlant des constructeurs (p4)
    http://www.developpez.biz/download/cppavance.pdf

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2006, 12h13
  2. Réponses: 7
    Dernier message: 21/12/2005, 16h44
  3. problème de déclaration
    Par dirty_boy dans le forum C
    Réponses: 2
    Dernier message: 16/09/2005, 11h56
  4. Réponses: 11
    Dernier message: 29/04/2005, 19h45
  5. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17

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