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++Builder Discussion :

Impl�mentation du design patern Singleton sous Borland C++ Builder XE [D�butant]


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    Juillet 2011
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur .NET

    Informations forums :
    Inscription : Juillet 2011
    Messages : 20
    Par d�faut Impl�mentation du design patern Singleton sous Borland C++ Builder XE
    Bonjour � tous, et � toutes,

    Arrivant de .Net C# je d�marre un projet en Borland C++ Builder (Embarcadero RAD Studio XE v2010 [v15.0.3953.35171]), et bien entendu j�ai du mal � retrouver mes petits�

    D�o� ma nouvelle question toute b�te : Je cherche � impl�menter le design pater singleton sous Borland C++ Builder.
    J�ai cherch� sur le net, je suis tomb� sur divers exemples que j�ai test�s dans mon projet Borland C++ Builder sans succ�s�

    Je suis en train d'essayer de m'inspirer de ce post pour essayer d'avancer : Plusieurs instances d'un singleton pour plusieurs modules


    Bon c�est un truc de base donc je suis sur que vous allez avoir un exemple, qui vas bien, d�impl�mentation de ce design � me proposer!

    Par contre, si possible :
    - Evit�s de donner un exemple avec une classe qui s�appelle singleton, car de suite �a devient vite incompr�hensible.
    - Bien pr�ciser le d�tail dans chaque fichier (.h pour la d�claration, .cpp pour la d�finition, .cpp avec le new pour l�utilisation).
    Le but �tant que ce poste puisse servir ensuite � un novice qui chercherait l�info dans le forum.


    Merci d�avance � tous et � toute pour votre aide

  2. #2
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Dans ton lien, Singleton est une template, c'est comme une macro mais appliqu� aux classes, c'est ce que l'on appel les g�n�riques, tu dois avoir la m�me chose en .NET non ? les m�thodes anonymes et tout �a ?

    Ce template Singleton est r�utilisable contrairement � l'exemple de la FAQ Comment faire pour emp�cher de cr�er plus d'une instance d'une classe ? que tu as du lire vu ta reproche "Evitez de donner un exemple avec une classe qui s�appelle singleton, car de suite �a devient vite incompr�hensible."
    As tu lu Pr�sentation des principaux design patterns en C++ - III. Le singleton par Come David?

    Malheureusement la template est difficilement � un objet VCL h�rit� de TObject
    Hors le principal int�r�t de C++ Builder c'est la VCL, sinon autant ne pas faire de C++Builder, les modifications n�cessaires suppriment l'allocation statique donc la lib�ration implicite, et malheureusement, on ne pas "templatis�" la lib�ration, il faut y penser ...


    Je suis aussi un habitu� de Singleton, j'ai adapt� ma m�thode que j'utilisais en Delphi, je ne sais pas si c'est la bonne !
    Je ne d�veloppe en C++ que depuis quelques mois et mes coll�gues ne d�veloppent pas en POO et Design Pattern, tout le code est dans les TForm, mais je dois bosser sur une partie avec une forte notion de g�n�ricit� (interface, factory, strategy ...)

    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
    19
    20
    21
    22
    23
    //---------------------------------------------------------------------------
    //                        TShaiORPersistentManager                         -
    //---------------------------------------------------------------------------
    class TShaiORPersistentManager : public TObject
    {
    private:
      // Membres Privés (Singleton)
      static TShaiORPersistentManager *FSingletonInstance;
     
      // Constructeurs Privés (Masqués)
      /*constructor*/__fastcall TShaiORPersistentManager();
     
    public:
      // Constructeurs Publiques
      /*destructor*/__fastcall ~TShaiORPersistentManager();
     
      // Méthodes Publiques (Singleton)
      static TShaiORPersistentManager* GetInstance();
      static void ReleaseInstance();
    };
    //---------------------------------------------------------------------------
    TShaiORPersistentManager * TShaiORPersistentManager::FSingletonInstance = NULL;
    //---------------------------------------------------------------------------
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    //---------------------------------------------------------------------------
    void SupervisionORClassesFinalization()
    {
      TShaiORPersistentManager::ReleaseInstance();
    }
    //---------------------------------------------------------------------------
    #pragma exit SupervisionORClassesFinalization
    //---------------------------------------------------------------------------
     
    //---------------------------------------------------------------------------
    //                        TShaiORPersistentManager                         -
    //---------------------------------------------------------------------------
    /*constructor*/__fastcall TShaiORPersistentManager::TShaiORPersistentManager()
    {
      ...
    }
     
    //---------------------------------------------------------------------------
    /*destructor*/__fastcall TShaiORPersistentManager::~TShaiORPersistentManager()
    {
      ...
    }
     
    //---------------------------------------------------------------------------
    /*static*/ TShaiORPersistentManager* TShaiORPersistentManager::GetInstance()
    {
      if ( ! FSingletonInstance)
      {
        FSingletonInstance = new TShaiORPersistentManager();
      }
      return FSingletonInstance;
    }
     
    //---------------------------------------------------------------------------
    /*static*/ void TShaiORPersistentManager::ReleaseInstance()
    {
      if (FSingletonInstance)
      {
        delete FSingletonInstance;
        FSingletonInstance = NULL;
      }
    }

    Tu peux aussi faire des objets C++ strict (sans VCL non-TObject), pour utilisation l'allocation statique (pas de new), un String par exemple c'est un objet utilis� souvent en allocation statique comme le TDateTime !
    Dans une DLL, c'est ce que j'ai fait, j'ai utilis� un objet c++ strict d�clar� dans le DllEntryPoint

    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
     
      static CMaClassDLL DllExportObject;
     
      switch( reason )
      {
        case DLL_PROCESS_ATTACH :
          DllExportObject.DLLProcessAttach();
        break;
     
        case DLL_THREAD_ATTACH :
        case DLL_THREAD_DETACH :
        break;
     
        case DLL_PROCESS_DETACH :
          DllExportObject.DLLProcessDettach();
     
        break;
      }
    DllExportObject sera lib�r� lors de sortie de la fonction, c'est la dur�e de vie standard g�r� en port�e de bloc { } d'une variable c

    le mot cl� static me permet d'avoir la m�me variable entre chaque appel de DllEntryPoint par un m�me process (par plusieurs thread par exemple)
    ce static est diff�rent du static des membres de classes, c'est pour rendre globale une variable locale (je l'ai interpr�t� ainsi)

    Je t'avouerais que mon programme est con�u de tel sorte que LoadLibrary ne soit lanc� qu'une seule fois (j'ai un syst�me d'instance registry et de factory pour g�rer mes classes et objets c�t� EXE encapsulant un tas de DLL implemetant un ensemble commun d'interfaces) donc je n'ai pas vraiement test� le comportement du static pour le moment, mon d�veloppement est en cours, j'ai encore plein de chose � faire !



    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class CMaClassDLL
    {
    public:
      // Membres Publiques
      static CMaClassDLL* Instance;
     
      // Méthodes Publiques
      void DLLProcessAttach();  // Must Call on DLL_PROCESS_ATTACH
      void DLLProcessDettach(); // Must Call on DLL_PROCESS_DETACH
    };
    //---------------------------------------------------------------------------
    CMaClassDLL* CMaClassDLL::Instance = NULL;
    //---------------------------------------------------------------------------
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void CMaClassDLL::DLLProcessAttach()
    {
      CMaClassDLL::Instance = this;
    }


    Les Objets VCL (TObject) ne peuvent �tre utilis�s en instanciation dynamique avec new mais tu peux ou utiliser les std::auto_ptr mais je ne sais pas si peu le faire en global, j'en utilise jamais, je reste habitu� au try finally du Delphi ou � la section finalization !

    Ah oui, contrairement au C# pas de Garbage Collector
    Il faut lib�rer la m�moire !
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    Juillet 2011
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur .NET

    Informations forums :
    Inscription : Juillet 2011
    Messages : 20
    Par d�faut
    Bonjour ShaiLeTroll,

    Et encore une fois merci pour ta r�ponse, qui comme � l�habitude es claire, nette et pr�cise, rempli d�exemples nickel pour toutes les situations.

    Alors je te r�ponds dans l�ordre :
    L�id�e du template est une bonne id�e, car �a �vite, bien entendu, de recoder � chaque fois le singleton dans toutes les classes qui l�utilise.

    Maintenant je t�avoue que je suis un peu perplexe quant � la mise en �uvre :
    Tout le code du template tu le mets dans un fichier .h, et ensuite tu mets une r�f�rence � ce .h dans chaque .h des classes qui l�utilisent?

    [Edit:] Je me r�pond � moi m�me.
    C'est exactement ce que j'indiquais: J'ai pris le template de cet exemple Plusieurs instances d'un singleton pour plusieurs modules, le template dans un .h que j'ai appeler Singleton, mis en r�f�rence dans le .h de ma classe Test qui utilise le singleton et �a marche nickel!

    Pour le lien Comment faire pour emp�cher de cr�er plus d'une instance d'une classe ? je l�avais bien vu et je l�ai zapp�, car son impl�mentation ne me convenait pas, trop loin de ce que je connais!
    Je pr�f�re de loin ton exemple, au moins on sait de quoi on parle!

    Pour la Pr�sentation des principaux design patterns en C++ - III. Le singleton par Come David, et bien justement c�est ce que je cherchais dans le forum C++ Builder� Comme je n�ai pas trouv� dans ce forum, je n�ai pas eu le r�flexe, � tort je l�avoue, de chercher dans le forum C++. Honte � moi�
    Maintenant j�ai tout ce qu�il me faut sous la main.

    Pour les objets C++ strict, je ne connais pas trop� J�ai du mal avec les statics� Je pr�f�re allouer mes petits et ensuite les d�truire�
    Mais je vais regarder de plus pr�s cet exemple, histoire d�en apprendre un peux plus� Surtout que normalement je vais avoir g�r� du multithread dans mon app�

    Pour la m�moire, t�inqui�tes m�me si j�arrive de .Net, il me reste en t�te des notions de base de C++ de ma formation initiale (BTS) : Donc un new, un delete, sinon bonjour les fuites m�moires�

    En tout cas encore merci pour ta r�ponse, et pour les exemples.
    C�est vraiment super d��tre tomb� sur quelqu�un comme toi qui sais de quoi il parle et qui es super r�actif.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. combox sous borland c++ builder 6
    Par themarki dans le forum C++Builder
    R�ponses: 0
    Dernier message: 16/06/2008, 09h14
  2. messagebox sous borland c++ builder
    Par themarki dans le forum C++Builder
    R�ponses: 4
    Dernier message: 14/06/2008, 12h22
  3. R�ponses: 2
    Dernier message: 11/06/2008, 10h55
  4. Impl�mentation du design pattern singleton
    Par 0pierrot0 dans le forum C++
    R�ponses: 1
    Dernier message: 22/01/2008, 10h01
  5. Problème avec GLUT sous borland c++ builder X
    Par hiko-seijuro dans le forum GLUT
    R�ponses: 1
    Dernier message: 04/11/2004, 12h47

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