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 :

Singleton sur plusieurs DLL


Sujet :

C++

  1. #21
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Citation Envoyé par Miles
    OK, c'est ce que je pensais. La raison provient sans doute de l'inline du singleton dans unit2.hpp.
    Le singleton en lui-même, il n'y a pas de raisons qu'il ne marche pas. J'ai fait un copié-collé exact d'ici: http://fr.wikipedia.org/wiki/Singlet...de_conception)).

    Citation Envoyé par Miles
    Vire la classe template en mettant ce qu'il faut dans ta classe, mais ne mets le corps de la fonction que dans unit2.cpp. Tu vois ce que je veux dire ?
    Tout à fait, c'est ce qu'il y avait dans ma première version (voir plus haut), et qui avait exactement le même comportement.

    Citation Envoyé par Miles
    Ca pourra peut-être marcher.
    Ca marche ou ça marche pas ? Parce que sans vouloir te vexer, et en te remerciant encore du temps que tu m'accordes, je n'ai pas l'impression que tu maitrises mieux le sujet que moi. Essayer des trucs au hasard en pensant que "ça pourra peut-être marcher", ça fait trois jours que je le fais, sans résultat.

  2. #22
    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 : 44
    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
    OK, on va y aller avec du code directement. N'oublie pas que ce qu'il y a sur Wikipedia, c'est pour un singleton dans le cas général, il n'est pas précisé qi ça marchait dans le cas que tu as.
    Dans Unit2.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MonSingleton
    {
    private:
        MonSingleton();
        //...définir ici le reste de l'interface
    public:
        static T& Instance();
     
        // C'est ce que je fais
        int Data;
    };

    Dans Unit2.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MonSingleton::Instance()
    {
        static MonSingleton aMoi;
        return aMoi;
    }
    C'est pas la même chose que ce que tu avais. Essaie une fois.

    Je ne peux jamais dire si ça va marcher, ce que je propose, je n'ai pas le temps d'essayer les solutions pour toi, mais je donne ce que je ferai en premier lieu pour arranger ce problème si je le rencontrai. C'est parfois judicieux, pafois pas.

  3. #23
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Après correction des erreurs de syntaxe mineures:

    remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static MonSingleton& Instance();
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonSingleton::Instance()
    remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonSingleton& MonSingleton::Instance()
    J'obtiens:
    [Lieur Erreur] Unresolved external 'MonSingleton::Instance()' referenced from D:\TEST_32\TESTSINGLETON\UNIT3.OBJ
    En compilant Projet. Evidemment, puisque cette méthode est définie dans Unit2.cpp qui n'est pas dans Projet.

  4. #24
    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 : 44
    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
    Tu fais pas l'édition des liens avec le fichier .lib ???

  5. #25
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Si, mais le .lib ne contient pas la méthode Instance. Il ne contient que ceci:

    @@Unit2@Finalize
    @@Unit2@Initialize
    GetData
    SetData
    __CPPdebugHook

  6. #26
    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 : 44
    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
    Ah oui, c'est ma faute, j'ai oublié le _export devant la méthode Instance()

  7. #27
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    C'est fantastique, ça marche.

    Ah oui, pour le prochain qui va se prendre la tête avec ça, voilà le code définitif:

    Unit2.cpp:

    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
    #pragma hdrstop
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
     
    extern "C" int _export GetData() {
      return MonSingleton::Instance().Data;
    }
     
    extern "C" void _export SetData(int Data) {
      MonSingleton::Instance().Data = Data;
    }
     
    MonSingleton::MonSingleton()
    {
    }
     
    MonSingleton& _export MonSingleton::Instance()
    {
        static MonSingleton aMoi;
        return aMoi;
    }
    Unit2.h:

    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
    #ifndef Unit2H
    #define Unit2H
     
    class MonSingleton
    {
    private:
        MonSingleton();
        //...définir ici le reste de l'interface
    public:
        static MonSingleton& _export Instance();
        // C'est ce que je fais
        int Data;
    };
     
    extern "C" int _export GetData();
    extern "C" void _export SetData(int Data);
     
    //---------------------------------------------------------------------------
    #endif
    Unit3.cpp:

    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
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit3.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
     
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
     
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::GetDataDllClick(TObject *Sender)
    {
      Edit1->Text = GetData();
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::SetDataDllClick(TObject *Sender)
    {
      SetData(Edit1->Text.ToInt());
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::GetDataSingletonClick(TObject *Sender)
    {
      Edit1->Text = MonSingleton::Instance().Data;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::SetDataSingletonClick(TObject *Sender)
    {
      MonSingleton::Instance().Data = Edit1->Text.ToInt();
    }
    Unit3.h:

    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
    #ifndef Unit3H
    #define Unit3H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // Composants gérés par l'EDI
      TEdit *Edit1;
      TButton *GetDataDll;
      TButton *SetDataDll;
      TButton *GetDataSingleton;
      TButton *SetDataSingleton;
      void __fastcall GetDataDllClick(TObject *Sender);
      void __fastcall SetDataDllClick(TObject *Sender);
      void __fastcall GetDataSingletonClick(TObject *Sender);
      void __fastcall SetDataSingletonClick(TObject *Sender);
    private: // Déclarations de l'utilisateur
    public:  // Déclarations de l'utilisateur
      __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    Merci, pardon si j'ai à un moment douté, et

  8. #28
    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 : 44
    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
    Pas de pb, on est là pour chercher

  9. #29
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    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
    19
    20
    21
    22
     
    //xx.h
    class Singleton {
     
    public:
        Singleton& getInstance();
        // public interface
    private: //ou protected
        Singleton();
        static Singleton* _instance;
        //autre données
    };
     
     
    xx.cpp
    Singleton* Singleton::_instance = 0;
     
    Singleton& Singleton::getInstance(){
       if(_instance==0)  // lazy initialization
          _instance = new Singleton;
       return _instance;
    }
    Note : jamais le constructeur ne doit être public !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MonSingleton& _export MonSingleton::Instance()
    {
        static MonSingleton aMoi;
        return aMoi;
    }
    Ceci n'est pas du C++, mais du C. static doit être réservé aux données statiques.

  10. #30
    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 : 44
    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
    Dit ça à Meyers, Alexandrescu et les autres.
    static, c'est du C++ aussi. On a le droit de le mettre ici.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. deploiment de code sur plusieurs machines et problème avec une dll
    Par eric1708 dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 17/12/2013, 09h55
  2. Faire une DLL répartie sur plusieurs fichiers
    Par guda dans le forum VB.NET
    Réponses: 3
    Dernier message: 06/08/2013, 11h12
  3. Réponses: 2
    Dernier message: 24/04/2012, 14h47
  4. plusieurs questions sur les Dll
    Par mnaulet dans le forum Windows
    Réponses: 4
    Dernier message: 07/08/2006, 09h39
  5. [CR] Groupement dynamique sur plusieurs champs paramètrés
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/06/2004, 18h55

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