begin process at 2012 05 27 15:03:57
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > [C++] CLASS REGISTER

[C++] CLASS REGISTER


 Information sur la source

Note :
Aucune note
Catégorie :Astuces Classé sous :class, allocation, instance, foreach, singleton Niveau :Initié Date de création :22/02/2010 Date de mise à jour :22/02/2010 18:50:04 Vu / téléchargé :2 737 / 65

Auteur : Miwik

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Permet de garder une trace de toutes les classes crees.


J'ai fais ce code a la base car j'utilise souvent Qt et les connections ne peuvent etre faites que en aillant les pointeurs sur les classes que l'on veut connecter.
Cette methode est un peu genante lors de gros projets (enfin a mon gout), ou il est dur de voir quelle classe est connectee a telle autre sachant que les connections sont faites un peu partout.
Maintenant de n'importe ou dans le code on peut connecter des classes sans avoir a garder un pointeur sur celles ci, ou les isoler dans une classe qui s'occupera de faire seulement des connections par exemple.

Le but de ce code n'est absolument pas de servir de garbage collector, et encore moins de servir pour autre chose que ce qu'il a ete prevu. En revanche on peut s'en servir pour voir le nombre de classes de tel ou tel type crees, faire des stats... tant qu'il n'y a pas d'interaction forte avec votre code qui le ferait dependre entierement de ce systeme.


Utilisation:

Pour enregister une classe la macro CR_REGISTER(class) ou "class" est le nom de votre classe est a utiliser dans le constructeur.
La macro CR_UNREGISTER(class) est quand a elle utilisee dans le destructeur.

Des macros servent ensuite a recuperer les instances de classes qu'on a enregistre, a partir de n'importe ou dans le code
CR_GETFIRST(class)        retourne la premiere instance de "class" trouvee
CR_GETALL(class)          retourne un std::vector contenant tous les pointeurs sur les "class" enregistrees
CR_FOREACH(class)         itere sur toutes les instances de "class", le pointeur se recupere avec CR_p


La sortie du main ci dessous est affichee sur le screenshot.

Source

  • // ======================== ClassRegister =========================
  • // Description: Do useless things, but do it well
  • // Made by: Remi Bourreau AKA Miwik
  • // Contact: miwikprog@gmail.com
  • // Rights: You can do what you want with this lol code :)
  • // ================================================================
  • #include <iostream>
  • #include <sstream>
  • #include <iomanip>
  • #include "ClassRegister.h"
  • // this class is used only to avoid copy of code in the test classes like operator << overload.
  • // display the creation and destruction with an identifier, nothing special here.
  • class Example
  • {
  • public:
  • Example(std::string strName) : _strName(strName), _id(++id)
  • {
  • std::ostringstream oss;
  • std::cout << "Creation <= " << _strName << std::setw(10 - _strName.size()) << _id << std::endl;
  • oss << "Heya im " << strName << "!" << std::setw(16 - _strName.size()) << _id;
  • _strWho = oss.str();
  • }
  • virtual ~Example() { std::cout << "Destruction => " << _strName << std::setw(10 - _strName.size()) << _id << std::endl; }
  • inline friend std::ostream &operator <<(std::ostream &os, Example &Example) { return os << Example.Who(); }
  • inline virtual std::string Who() const { return _strWho; }
  • protected:
  • static int id;
  • private:
  • std::string _strName;
  • std::string _strWho;
  • int _id;
  • };
  • int Example::id = -1;
  • // macro CR_REGISTER(type) must be used in the constructor to register the class,
  • // if not you wont be able to access your class later.
  • // macro CR_UNREGISTER(type) must be used in the destructor to unregister the class,
  • // if not you will have some cool segfaults when trying to access an already deleted class.
  • class One : public Example
  • {
  • public:
  • One() : Example("One") { CR_REGISTER(One); }
  • virtual ~One() { CR_UNREGISTER(One); }
  • };
  • // same here
  • class Two : public Example
  • {
  • public:
  • Two() : Example("Two") { CR_REGISTER(Two); }
  • virtual ~Two() { CR_UNREGISTER(Two); }
  • };
  • // another one
  • class Tree : public Example
  • {
  • public:
  • Tree() : Example("Tree") { CR_REGISTER(Tree); }
  • virtual ~Tree() { CR_UNREGISTER(Tree); }
  • };
  • // without call to macros
  • class Hey : public Example
  • {
  • public:
  • Hey() : Example("Hey") {}
  • virtual ~Hey() {}
  • };
  • // show how to get the objects registered with the macro
  • // the macros CR_* can be use everywhere in your code
  • int main()
  • {
  • One *o0 = new One; // id 0
  • One o1; // id 1
  • Two *t2 = new Two; // id 2
  • One o3; // id 3
  • One *o4 = new One; // id 4
  • Two t5; // id 5
  • Tree e6; // id 6
  • Hey ho;
  • std::cout << "\nCR_GETFIRST One" << std::endl;
  • One *one = CR_GETFIRST(One);
  • if (one)
  • std::cout << *one << std::endl;
  • std::cout << "\nCR_GETFIRST Two" << std::endl;
  • Two *two = CR_GETFIRST(Two);
  • if (two)
  • std::cout << *two << std::endl;
  • // call of a non registered object
  • Hey *hey = CR_GETFIRST(Hey);
  • if (hey)
  • std::cout << "wtf ? o.O " << *hey << std::endl;
  • delete o0; // delete test
  • std::cout << "\nCR_FOREACH One" << std::endl;
  • CR_FOREACH(One)
  • {
  • std::cout << *CR_p << std::endl;
  • }
  • std::cout << "\nCR_FOREACH Two" << std::endl;
  • CR_FOREACH(Two)
  • std::cout << *CR_p << std::endl;
  • delete t2;
  • delete o4;
  • CR_KILL;
  • return 0;
  • }
// ======================== ClassRegister =========================
// Description: Do useless things, but do it well
// Made by: Remi Bourreau AKA Miwik
// Contact: miwikprog@gmail.com
// Rights: You can do what you want with this lol code :)
// ================================================================

#include <iostream>
#include <sstream>
#include <iomanip>

#include "ClassRegister.h"

// this class is used only to avoid copy of code in the test classes like operator << overload.
// display the creation and destruction with an identifier, nothing special here.
class Example
{
public:
    Example(std::string strName) : _strName(strName), _id(++id)
    {
        std::ostringstream oss;

        std::cout << "Creation    <= " << _strName << std::setw(10 - _strName.size()) << _id << std::endl;
        oss << "Heya im " << strName << "!" << std::setw(16 - _strName.size()) << _id;
        _strWho = oss.str();
    }
    virtual ~Example() { std::cout << "Destruction => " << _strName << std::setw(10 - _strName.size()) << _id << std::endl; }

    inline friend std::ostream &operator <<(std::ostream &os, Example &Example) { return os << Example.Who(); }
    inline virtual std::string Who() const { return _strWho; }

protected:
    static int id;

private:
    std::string _strName;
    std::string _strWho;
    int _id;
};

int Example::id = -1;

// macro CR_REGISTER(type) must be used in the constructor to register the class,
// if not you wont be able to access your class later.
// macro CR_UNREGISTER(type) must be used in the destructor to unregister the class,
// if not you will have some cool segfaults when trying to access an already deleted class.
class One : public Example
{
public:
    One() : Example("One") { CR_REGISTER(One); }
    virtual ~One() { CR_UNREGISTER(One); }
};

// same here
class Two : public Example
{
public:
    Two() : Example("Two") { CR_REGISTER(Two); }
    virtual ~Two() { CR_UNREGISTER(Two); }
};

// another one
class Tree : public Example
{
public:
    Tree() : Example("Tree") { CR_REGISTER(Tree); }
    virtual ~Tree() { CR_UNREGISTER(Tree); }
};

// without call to macros
class Hey : public Example
{
public:
    Hey() : Example("Hey") {}
    virtual ~Hey() {}
};

// show how to get the objects registered with the macro
// the macros CR_* can be use everywhere in your code
int main()
{
    One *o0 = new One; // id 0
    One o1;            // id 1
    Two *t2 = new Two; // id 2
    One o3;            // id 3
    One *o4 = new One; // id 4
    Two t5;            // id 5
    Tree e6;           // id 6
    Hey ho;


    std::cout << "\nCR_GETFIRST One" << std::endl;
    One *one = CR_GETFIRST(One);
    if (one)
        std::cout << *one << std::endl;

    std::cout << "\nCR_GETFIRST Two" << std::endl;
    Two *two = CR_GETFIRST(Two);
    if (two)
        std::cout << *two << std::endl;

    // call of a non registered object
    Hey *hey = CR_GETFIRST(Hey);
    if (hey)
        std::cout << "wtf ? o.O  " << *hey << std::endl;

    delete o0; // delete test

    std::cout << "\nCR_FOREACH  One" << std::endl;
    CR_FOREACH(One)
    {
        std::cout << *CR_p << std::endl;
    }

    std::cout << "\nCR_FOREACH  Two" << std::endl;
    CR_FOREACH(Two)
            std::cout << *CR_p << std::endl;

    delete t2;
    delete o4;

    CR_KILL;

    return 0;
}

 Conclusion

<(o.O)>

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

22 février 2010 15:32:49 :
Oublie de detruire le singleton :D
22 février 2010 18:50:05 :
p'tit clean du code

 Sources du même auteur

Source avec Zip Source avec une capture [C++] GENERATEUR DE PSEUDO

 Sources de la même categorie

Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
SMART POINTEUR À COMPTEUR DE RÉFÉRENCE par nirgal76

 Sources en rapport avec celle ci

UTILISATION DES TYPELIST EN C++ par wyden
Source avec Zip GSTRING - GESTION DES CHAINES DE CARACTÈRES par Neokript
Source avec Zip CLASS SIMPLE POUR LIRE DES FICHIER *.INI par lglandeur
Source avec Zip CLASS STRING par T_Mehdi
RESISTANCE EQUIVALANTE DE RESISTANCES EN SERIE OU PARALLELE par neocoder

Commentaires et avis

Commentaire de pop70 le 09/04/2010 19:15:51

Ce code fonctionne parfaitement, mais n'est il pas plus simple d'utiliser des méthodes statiques ?

Commentaire de Miwik le 11/04/2010 04:13:23

Salut,

On peut pas vraiment utiliser de methodes statiques dans ces cas:
pour l'instruction # par exemple qui est directement une instruction pour le preprocesseur.
la macro CR_FOREACH, comment recuperer l'objet sur lequel on itere si c'est une methode, ou alors carement faire une autre classe... mais ca parait lourd.
ensuite les autres macros ont "this" dedans qui permet juste de pas avoir a l'ecrire a chaque fois qu'on veut enregistrer une classe, avec une methode on serait oblige de l'ecrire.

Les macros ici sont utilisees pour unifier les fonctions diponibles et simpifier au maximum l'utilisation. Le meme fonctionnement peut etre bien sur refait avec des methodes statiques ou meme une classe (dans le cas du foreach) mais ca serait bien moins simple dans l'utilisation que les macros.

J'espere avoir repondu a ta question :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Automate Singleton pb de linkage [ par 9sber ] J'essai de construire un petit prog qui mets en oeuvre un automate de singleton comme suit.Mais à la compilation j'ai des pbs de Linkage.J'ai une clas connaître l'instance de class [ par jerame ] Bonjour &#224; tous, J'ai plusieurs class qui h&#233;ritent les unes des autres, je souhaiterais conna&#238;tre l'instance de ma class, pour savoir s Singleton et héritage [ par Dany82 ] Voila mon probleme:J'utilise le template:template &lt;typename T&gt;class singleton{protected:&nbsp;// Constructor/Destructor&nbsp;singleton( ) {&nbsp probleme de map erreur de link [ par hisoka56 ] Bonjour, j'ai un problème de link: Linking... edition.obj : error LNK2019: unresolved external symbol __imp___CrtDbgReportW referenced in .... Cela Déclaration d'une class [ par Turok ] Salut, Je d&#233;bute en C++, et dans mon prog j'ai cr&#233;er une class. Le prob, c'est que quand une instance de cette class (Class_object objet("&l class et fichier [ par lilington ] salut j'ai 2 questions: 1- est il possible de stocker une classe dans un fichier comme on ferai pour une structure? par exemple si je fais un carnet d class pour reorganiser un programme en C [ par shadow1779 ] Bonjour,j'ai termin&#233; un programme cependant il est presque incomprehensible du fait de nombreuses lignes et tout le code dans un meme fichier .cp [C][vc++]fermeture d'un prog a n'y rien comprendre [ par shadow1779 ] Bonjour j'ai un soucis avec un prog,&nbsp; il&nbsp; se lance correctement mais j'utilise des class pour reograniser mon programme c'est a dire que dan Problème de drawline [ par giom236 ] quelqu'un sait pourquoi drawline(p,100,200,101,200) affiche une ligne de deux pixels de long, alors que drawline(p,100,200,100,200) n'affiche rien du Probléme allocation mémoire! avec un void [ par psyko_flex ] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Voila je dois controler un bandeau lumineux, voila mon probl&#233;me,c'est&nbsp;avec la variable TrameRecue!! je


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales