wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 2
Pub hébergeur
Pourquoi cette pub ?

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Divers
» Echange de données entre objets et création de variables globales
Détails du snippet : Echange de données entre objets et création de variables globales
Informations sur l'auteur de ce snippet :


Hors ligne
gbdivers (Membre)
Inscrit le : 05-03-2008
Messages: 92
Snippets: 2
Tutoriels: 0
Introduction / Description :
Un problème régulièrement rencontré en programmation orientée objet (en particulier pour programmer dans un environnement graphique tel que wxWidgets) est de permettre à différents objets (des fenêtres, des bouttons...) de communiquer entre eux. Par exemple pour créer une barre d'outils flottante qui intergit avec une autre barre d'outils.
Contenu du snippet :
Pour illuster ce code, je vais prendre comme exemple 2 classes, A et B, la classe A devant appeler une méthode "message" de la classe B. Les classes A et B n'ont pas de liens entre elles

Code wxWidgets:

 
/* Fichier A.h */
class A
{
  public:
    A() {}
    void message_de_A();
};
 
/* Fichier A.cpp */
#include "A.h"
 
void A::message_de_A()
{
    b->message_de_B();
}
 
/* Fichier B.h */
class B
{
  public:
    B() {}
    void message_de_B();
};
 
/* Fichier B.cpp */
#include "B.h"
 
B::message_de_B()
{
    wxMessageBox(_("Coucou"), _("Le message"));
}
 
/* Fichier principal app.h */
#include <wx/wx.h>
 
class app : public wxApp
{
  public:
    virtual bool OnInit();
};
 
/* Fichier app.cpp */
#include "app.h"
#include "A.h"
#include "B.h"
 
app::OnInit()
{
    A* a = new A();
    B* b = new B();
    a->message_de_A();
}
 

Ce code produit une erreur du fait que la variable b n'existe pas pour a. On va donc rendre b globale.


Méthode 1 : Options de compilation

Code wxWidgets:

 
/* Ajouter dans app.h */
#ifdef GLOBAL
    B* b;
#else
    extern B* b;
#endif
 
/* Modifier app.cpp */
#define PT_GLOBAL     // on précise qu'on est en global
#include "app.h"
#include "A.h"
#include "B.h"
 
wxApp::OnInit()
{
    A* a = new A();
    b = new B();       // attention de ne pas redéclarer b
    a->message_de_A();
}
 
/* Ajouter dans A.h */
#include "App.h"
 



Méthode 2 : variable statique dans une classe

Code wxWidgets:

 
/* Modifier B.h */
class B
{
  public:
    B() {}
    void message_de_B();
    static B* Get();      // Ajout d'une fonction qui retourne toujours un pointeur valide
}
 
/* Ajouter dans B.cpp */
static B* instance = NULL;
 
B* B::Get()
{
    if (!instance)
        instance = new B();
    return instance;
}
 
/* Modifier app.cpp */
#include "app.h"
#include "A.h"
 
app::OnInit()
{
    A* a = new A();       // on ne crée plus d'instance de B
    a->message_de_A();
}
 
/* Modifier A.cpp */
#include "A.h"
#include "B.h"
 
void A::message_de_A()
{
    B* b = B::Get();      // on appelle la fonction Get() qui
                          // retourne toujours un pointeur valide
    b->message_de_B();
}
 

Cette solution est utilisé dans Code::Blocks pour créer une manager qui permet l'échange de données entre les fenêtres (fichier "manager.h").

Une autre solution (pour ce cas simple) aurait été de conserver un pointeur vers la classe B. par exemple :

Code wxWidgets:

 
class A
{
    B* m_b;
  public:
    A(B* b) { m_b = b; }
};
 
app::OnInit()
{
    B* b = new B();
    A* a = new A(b);
    a->message_de_A();
}
 

C'est la solution utilisé lorsque l'on crée un control dans une fenêtre (le premier paramètre transmis est un wxWindow* parent)
Explications finales :
Ces 2 exemples sont des méthodes "relativement élégantes", qui devraient aider quelque uns d'entre vous.
La seconde méthode est préférable, du fait qu'elle assure que le pointeur soit toujours valide et qu'elle oblige d'ajouter qu'un seul #include.
Commentaires
fabrizio (Membre)
Lieu: france
Inscrit le : 06-04-2008
Messages: 28
Snippets: 0
Tutoriels: 0
Site web
Hors ligne
merci gbdivers pour cette explication,
à noté que la seconde version est un patron de conception (design pattern) de création: Singleton

pour information: http://fr.wikipedia.org/wiki/Singleton_(patron_de_conception)

Vouloir être de son temps, c'est déjà être dépassé.
gbdivers (Membre)
Inscrit le : 05-03-2008
Messages: 92
Snippets: 2
Tutoriels: 0
Hors ligne
Lien tres interessant. Pour tout ceux qui doivent travailler sur la structure d'un projet, lire absolument l'article sur les patron de conception !

Merci fabrizio
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Divers
» Echange de données entre objets et création de variables globales