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 :

Initialisation variable membre static const double


Sujet :

C++

  1. #1
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut Initialisation variable membre static const double
    Bonjour,

    J'ai un probl�me d'initialisation d'une variable membre de type static const double, mais uniquemment sous Windows (Visual Studio) et pas sous Linux/MacOSX.

    Si on a la classe suivante:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    class Foo
    {
      private:
        static const double forceMin = 100.0;
        static const double forceMax = 5000.0;
    };
    Sou Linux et MacOSX, aucun probl�me, alors que sous windows, �a ne compile pas et renvoie une erreur du style (j'ai plus le message exact):
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    can't initialize non-integral static const membre
    Sous Linux et MacOSX je choisis mes options de compilation, sous windows/VisualStudio parcontre c'est tr�s obscure pour moi.

    J'ai pas compris le probl�me et pourquoi il apparait uniquement sous windows.

    Merci de votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Bonjour,

    Il me semble qu'il faut initialiser les static dans le .cpp :
    Code foo.h : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    class Foo
    {
      private:
        static const double forceMin;
        static const double forceMax;
    };

    Code foo.cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    double Foo::forceMin = 100.0;
    double Foo::forceMax = 5000.0;

    EDIT : Apr�s une simple recherche :
    Citation Envoy� par http://stackoverflow.com/questions/9656941/why-i-cant-initialize-non-const-static-member-or-static-array-in-class
    The C++ standard allows only static constant integral or enumeration types to be initialized inside the class.

  3. #3
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    OK, c'est ce que j'ai cru comprendre aussi, mais pourquoi sous Linux et MacOSX je n'ai pas eu de probl�me alors que j'initialise dans le .h.

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    D�veloppeur C
    Inscrit en
    Ao�t 2004
    Messages
    2 366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur C

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 2 366
    Par d�faut
    En effet, j'ai l'erreur avec VS 2008.

    Pourtant en regardant la MSDN sur le code d'erreur C2864 Microsoft dit que �a devrait marcher. Ah non :

    Bon si tu remplaces double par int, �a marche. Il doit y avoir une restriction sur le type. Reste a savoir ce qu'est une donn�e "int�grale".

  5. #5
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Citation Envoy� par fregolo52 Voir le message
    Bon si tu remplaces double par int, �a marche.
    Ah nan, �a �a va pas �tre possible.
    Citation Envoy� par fregolo52 Voir le message
    Il doit y avoir une restriction sur le type.
    Dans les options de compilation de visual studio? D'ailleurs j'aimerai bien les connaitres.

    Citation Envoy� par fregolo52 Voir le message
    Reste a savoir ce qu'est une donn�e "int�grale".
    C'est ce que je me demande �galement.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Citation Envoy� par fregolo52 Voir le message
    En effet, j'ai l'erreur avec VS 2008.

    Pourtant en regardant la MSDN sur le code d'erreur C2864 Microsoft dit que �a devrait marcher. Ah non :
    Il faudrait essayer avec mingw, il me semble que Microsoft avec Visual Studio ne voulait pas suivre enti�rement le C++11 (?)

    Citation Envoy� par fregolo52 Voir le message
    Bon si tu remplaces double par int, �a marche. Il doit y avoir une restriction sur le type. Reste a savoir ce qu'est une donn�e "int�grale".
    Une donn�e "int�grale", ce n'est pas un entier (int abr�viation de integer = int�grale) ?

  7. #7
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Citation Envoy� par Neckara Voir le message
    Il faudrait essayer avec mingw, il me semble que Microsoft avec Visual Studio ne voulait pas suivre enti�rement le C++11 (?)
    J'avais pens� installer et tester avec Cygwin, parcontre je savais pas que visual studio ne suivait pas entierement C++11, merci pour l'info.
    Citation Envoy� par Neckara Voir le message
    Une donn�e "int�grale", ce n'est pas un entier (int abr�viation de integer = int�grale) ?
    C'est ce que je me disait, mais pourquoi pas mettre integer dans ce cas?
    A moins qu'il y ait juste une diff�rence subtile.

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Citation Envoy� par LinuxUser Voir le message
    J'avais pens� installer et tester avec Cygwin, parcontre je savais pas que visual studio ne suivait pas entierement C++11, merci pour l'info.
    Il m'a sembl� l'avoir lu mais je n'en suis pas s�r � 100%.

    Citation Envoy� par LinuxUser Voir le message
    C'est ce que je me disait, mais pourquoi pas mettre integer dans ce cas?
    A moins qu'il y ait juste une diff�rence subtile.
    Integer fait r�f�rence � int et integral � tous les entiers de (unsigned) char � (unsigned)long long int ?

  9. #9
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par d�faut
    Citation Envoy� par fregolo52
    Reste a savoir ce qu'est une donn�e "int�grale".
    Citation Envoy� par LinuxUser
    C'est ce que je me demande �galement.
    Pour visualiser ce que recouvre l'ensemble des types "integral" :
    http://home.roadrunner.com/~hinnant/TypeHiearchy.pdf

    Edit : En C++03 seul les types const static "integral" et enum peuvent �tre initialis�s dans la classe (dans le .h). Donc si �a marche pour les doubles avec GCC c'est probablement du � une extension, il faudrait essayer avec l'option -pedantic et voir si �a g�n�re un warning.

  10. #10
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Citation Envoy� par Arzar Voir le message
    Pour visualiser ce que recouvre l'ensemble des types "integral" :
    http://home.roadrunner.com/~hinnant/TypeHiearchy.pdf

    Edit : En C++03 seul les types const static "integral" et enum peuvent �tre initialis�s dans la classe (dans le .h). Donc si �a marche pour les doubles avec GCC c'est probablement du � une extension, il faudrait essayer avec l'option -pedantic et voir si �a g�n�re un warning.
    En effet tu as tout � fait raison, il me semblait avoir mis l'option -pedantic et en fait nan, je l'avais oubli�.
    A pr�sent cela g�n�re l'erreur suivante:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    erreur: floating-point literal cannot appear in a constant-expression
    attention : ISO C++ forbids initialization of member constant ‘Foo::forceMax’ of non-integral type ‘const double[-pedantic]

  11. #11
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Je dois donc initailiser mes membres dans le cpp plut�t alors.

  12. #12
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Je dois donc initailiser mes membres static const double dans le constructeur dans le cpp alors.

    Moi je trouvais cela mieux de les initialiser directement dans le .h plutot que dans le constructeur.

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Citation Envoy� par LinuxUser Voir le message
    Je dois donc initailiser mes membres static const double dans le constructeur dans le cpp alors.

    Moi je trouvais cela mieux de les initialiser directement dans le .h plutot que dans le constructeur.
    On initialise pas les variables statique (et surtout const) dans un constructeurs.

    Cf mon premier post.

  14. #14
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Citation Envoy� par Neckara Voir le message
    Code foo.cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    double Foo::forceMin = 100.0;
    double Foo::forceMax = 5000.0;
    Oui c'est vrai, je n'avais pas vu.
    Mais de le .cpp, tu fais cette initialisation o�? Tout au d�but, en dehors de tout alors (comme une varible globale)?

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    C'est comme lorsque tu impl�mentes une m�thode de ta classe.

    Code .cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Foo::Foo(void)
    {
    }
     
    bool Foo::fooo(void)
    {
          return m_fooo;
    }
     
    bool Foo::m_fooo = true;

  16. #16
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    D'accord, j'ai compris, je vais tester � pr�sent.

  17. #17
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Ca ne marche pas, le compilateur consid�re que dans le .cpp j'essaye de d�finir une seconde fois une varible qui existe d�j�:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ...has a previous declaration as...
    EDIT: en fait il fallait "r�p�ter" le mot clef const, et l� �a marche.
    Foo.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    const double Foo::forceMin = 100.0;
    et non pas :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    double Foo::forceMin = 100.0;
    Dans ce cas, pourquoi �a r�le pas pour le mot clef static que je n'est pas "r�p�t�" ?

    Je rappelle le Foo.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    class Foo
    {
    private:
      static const double forceMin;
    };
    Petite question subsidiaire, comment pr�fixeriez-vous cette varible membre pour indiquer qu'il s'agit d'un static const?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    s_forceMin;
    s_constForceMin;
    ...

  18. #18
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Pour le const c'est de ma faute d�sol�

    Pour le static, il peut avoir 3 effets/signification.
    Si tu le rajoutes � l'ext�rieur de ta classe, tu vas dire que ta variable ne peut �tre visible que dans le fichier o� tu l'a d�clar�.

    Sinon pour la pr�fix�, je ne mettrait que m_machin pour dire que c'est un membre, mais pas plus.

  19. #19
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Donc
    Foo.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    // visible uniquement dans Foo.cpp
    static const double Foo::forceMin = 100.0;
    et
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    // je vois pas la difference 
    const double Foo::forceMin = 100.0;

  20. #20
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    La diff�rence est assez simple :
    erreur : 'static' may not be used when defining (as opposed to declaring) a static data member [-fpermissive]
    Un membre doit �tre visible dans toute la classe, et non pas �tre visible dans un seul fichier.

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

Discussions similaires

  1. Initialisation de membre static
    Par Derfh dans le forum C++
    R�ponses: 3
    Dernier message: 02/12/2014, 08h47
  2. Initialisation d'un membre static const
    Par la_urre dans le forum Langage
    R�ponses: 4
    Dernier message: 07/10/2010, 10h31
  3. [POO] D�finition des variables membre static
    Par Aur�lienB dans le forum Langage
    R�ponses: 13
    Dernier message: 18/02/2008, 11h39
  4. Initialisation de membres static const
    Par NiamorH dans le forum C++
    R�ponses: 16
    Dernier message: 14/01/2008, 16h50
  5. R�ponses: 2
    Dernier message: 30/10/2006, 16h40

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