Problème de namespace

Signaler
Messages postés
185
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
16 juillet 2016
-
Messages postés
185
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
16 juillet 2016
-
Bonjour,

Je rencontre un petit problème de namespace, c'est une notion que je ne maîtrise pas totalement. J'y vois un intérêt, particulièrement pour faire des variable pseudo globales aux classes que je crée qui ont des liens entre elles. Par contre, je rencontre souvent des problèmes de déclaration et de définition de variable en tout genre à en m'arracher  les cheveux.
En l'occurence en ce moment.
Grosso modo, j'ai une classe Bouton qui est spécifique à mon application et qui est donc utilisée dans la fenêtre de mon application. Cette application fait partie d'un groupe d'application qui ont un lien entre elles. J'utilise des namespace qui traduisent ces relation et cela me donne :
MyWindow.h
#include ....

namespace Group{
    namespace MyApp{
        class MyWindow{
               MyWindow();
        }
    }
}

MyWindow.cpp

#include "MyWindow.h"

#include ....

#include "MyButton.h"


namespace Group{

    namespace MyApp{

        MyWindow::MyWindow(){
            /* création de mon interface utilisant des Group::MyApp::MyButton */
            MyButton *boutonOK=new MyButton("Ok");
        }

    }

}



MyButton.h




#include ....



namespace Group{


    namespace MyApp{


        class MyButton{
             MyButton();
        }


    }


}




MyButton.cpp






#include ....


#include "MyButton.h"



namespace Group{



    namespace MyApp{



        MyButton::MyButton(){
              /* Création de mon bouton de type Group::MyApp::MyButton */
        }



    }



}





Main.cpp








#include ....



#include "MyWindow.h"
using namespace Group::MyApp;





int main(){
    MyWindow* window=new MyWindow();
}






Tout ça, mis à part erreurs possibles car création de l'exemple un peu vite fait
Mais je pense que ça, ça fonctionne grosso modo.

Maintenant je voudrais définir une variable "globale" dans l'espace de nom Group::MyApp qui doit être utilisée dans les deux classes. Genre par exemple, une variable qui serait modifiée par l'utilisateur à l'aide de l'interface (check box ou autre) et qui conditionnerait le comportement de mes boutons. Je déclare donc cette variable dans le namespace anonyme de mon namespace Group::MyApp. Cette variable sera donc accessible par MyWindow et MyButton facilement.
La question est, où dois-je le faire, où puis-je l'initialiser... comment pourquoi ????. j'ai essayé en la mettant dans le MyWindow.h.
MyWindow.h


#include ....


namespace Group{

    namespace MyApp{
        namespace{
              Bool MyConditionalVariable;
        }

        class MyWindow{

               MyWindow();

        }

    }

}
et 
MyButton.cpp




[code]




#include ....



#include "MyButton.h"




namespace Group{




    namespace MyApp{




        MyButton::MyButton(){

              /* Création de mon bouton de type Group::MyApp::MyButton */
              if(MyConditionalVariable){.....}

        }




    }




}






Il échoue à la compilation quand j'essaie d'utiliser MyConditionalVariable dans le fichier MyButton.h car MyConditionalVariable n'est pas déclarée, first use in function MyButton::MyButton()....

Si je lui précise Group::MyApp::MyConditionalVariable, il me dit qu'elle n'est pas membre de Group::MyApp. Si je déclare MyConditionalVariable dans le fichier MyButton.h, c'est en compilant MyWindow.h qu'il me crache dessus.

Bref, comment doit-on s'y prendre pour que les variables déclarée dans un namespace dans un des fichierssoit réellement globale à tout le namespace.
Peut-être faut-il rajouter des usin namsepace un peu partout ? je ne sais pas....

Merci

Hervé
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"

3 réponses

Messages postés
185
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
16 juillet 2016

Bon en fait j'ai résolu le problème de la même manière que j'ai utilisé en C#

j'ai créé un namespace indépendant dans un fichier.h indépendant que j'inclus dans les différents fichiers ou j'utilise les variables globales. ça fonctionne très bien. C'est plus propre en utilisant que des variables statiques...

myglobals.h
namespace MyGlobals{
      static Bool MyConditionalVariable;
}

 #include "myglobals";

MyGlobals::MyConditionalVariable; //accès simple aux variables globales... un petit using namspace MyGlobals éventuellement, et se sont de véritable vairable globales...

ça crée quelques messages de warning disant que les variables sont définies mais pas utilisée dans les fichiers où effectivement, elles ne sont pas utilisées, mais je préfère ça, c'est bcp moins prise de tête, à ce demander si c'est possible de faire autrement.

Merci quand même
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
Messages postés
185
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
16 juillet 2016

Bon ben en fait ça n'a pas l'air de fonctionner non plus.

Il me semble qu'il crée autant de variable différente que je fasse d'include de "MyGlobals.h" car j'ai créé un QMap<QString,int> dans mon espace de nom MyGlobals et dans le fichier ou je la remplie, j'y accède sans problème à toutes les valeurs, mais quand je veux y accéder d'un autre fichier (avec un #include entre temps), en asynchrone, la QMap (tableau associatif en Qt)  est vide

Est-ce normal que malgré le #ifndef #define il me fasse ce genre de truc ??

Merci
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
Messages postés
185
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
16 juillet 2016

Et en utilisant des extern patati patata ???

j'ai essayé de déclarer :
extern QMap<QString,int> MyGlobals::MyMap;

mais il me crie dessus parce que MyGlobals n'a pas été déclaré... peut-on déclaré un namespace en externe, genre extern namespace MyGlobals; ????
ou peut-être la solution serait de faire exactement comme en C#, crée une classe dans l'espace de nom MyGlobals, une véritable classe, mais avec que des attributs statics.
Cela fonctionnerait peut-être mieux que déclarer des attributs statiques dans un namespace. Namespace qui me semble apparemment limités au fichier dans ce cas là.

L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"