Comment gérer une classe statique pour un programme ? [Résolu]

Signaler
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
Bonjour,

Alors, voila la requête ne devrait pas vous posée trop de souci mais j'avoue galérer un peu. J'ai une classe Logger qui me permet de gérer un journal de log (Jusque là normal ^^). Le petit souci intervient lorsque je me demande:
- comment faire pour ne créer qu'une seule instance de cette classe pour mon programme
- et surtout, comment accéder à cet objet dans n'importe quelle partie de mon code (de toutes les pages cpp) : quelle déclaration utilisée en haut de la feuille ?
J'ai quelques petites idées mais surement pas encore les bonnes. J'ai pensé à une classe static mais j'avoue ne pas trop savoir comment cela marche. Et à quand je recherche static, je ne trouve pas mon bonheur ^^. J'ai aussi pensé aux classes Nested mais je ne sais pas si c'est vraiment adapté ou si cela n'a rien à voir.

Comment feriez-vous ?

(je travaille sous visual studio .net 2003 avec le MFC)

Merci à vous,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------

5 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
23
Salut,
Une classe static veut dire qu' aucun membre d'instance n'existe dans la classe. On appelle toujours ses méthodes par Classe::Methode().
Cette classe n'est pas instanciable en tant qu'OBJET.
Exemple minimal (juste le Log.h suffit pour tout le prog)
Le fichier est ouvert au premier appel de la méthode d'écriture et est fermé à la fin du prog.

//////////////////////////////////////////////////////////////////////////////
// Log.h

class Log
{
private:
      static CStdioFile file;

public:
      static void WriteString(const CString& str);
      static void Close() { file.close(); }
};

//////////////////////////////////////////////////////////////////////////////
// Log.cpp

// Init membre static

CStdioFile Log::file.m_hFile = NULL;

// WriteString

void Log::WriteString(const CString& str)
{
           // premier passage, le fichier n'est pas ouvert
            CFileStatus status;
            if( !file.GetStatus(status) )
            {
                  // Création du SEUL fichier du prog en écriture
                  // file.Open("debug.log", modeCreate | modeWrite)
            }
            // Ecrit la chaine
            // file.WriteString(str);
}

//////////////////////////////////////////////////////////////////////////////

// Utilisation partout ou #include "Log.h" est présent
// Le premier appel crée le fichier en écriture.

Log::WriteString("une chaine de log");

// MFC fermera le fichier à la fin du prog, mais on peut le faire

Log::Close();

Ce morceau de code n'est pas testé, c'est juste un exemple.
On pourrait mettre le style printf au WriteString
static void WriteString(const char* fmt,  ...);
Rajouter des attributs de couleur avec le protocole RTF.
ect...
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
Pour une seule est unique instanciation de class, il te faut une classe dite singleton. Pour cela, tu declare une classe ayant son constructeur private avec une methode static te permettant de l'instancier.

Exemple d'instanciation :

maClassSingleton* maClass;

maClassSingleton::create(maClass);

Ainsi la seule facon qque tu as de créer ta classe est par la méthode static create. Ainis tu peux savoir si ta classe est déjà instanciée ou pas ! Et donc ne pas pouvoir en instancier d'autres.

Cherche plus de détail sur la classe singleton sur Google.
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Ok, merci beaucoup pour ce début de réponse. Je vais aller l'approfondir sur google. Si vous avez des exemples très concrêt (lien ou autres) je suis preneur.
J'aimerais aussi savoir comment récupérer l'objet partout dans mon code.

Si je trouve, je mettrais des infos sur ce post.

Merci encore,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
23
PS : Le problème du Singleton (qui est une bonne idée) est qu'il faut externaliser l'objet à tous les modules cpp du prog.
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Merci à vous pour vos réponses. Je vais voir tout cela. Je vais quand même étudier le singleton car ça a l'air très intéressant comme truc.

Bon week-end !

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------