#include <vector> #include using namespace std; class Classe { public: Classe(int); static vector<Classe *> vect; int separateur; int nombre; static void creerClasse(); }; std::vector<Classe*> Classe::vect; using namespace std; Classe::Classe(int nb) { nombre = nb; cout << "\n\tLOCALISATION : Constructeur de classe\n"; cout << "\n[DEBUG] 'nombre' dans constructeur de Classe() : " << nombre; printf("\n[DEBUG] @'nombre' dans constructeur de Classe() : 0x%08x", &nombre); printf("\n[DEBUG] @'cl' dans constructeur de Classe() : 0x%08x\n", this); vect.push_back(this); } void Classe::creerClasse() { cout << "\n\tLOCALISATION : 'creerClasse()'\n"; Classe cl(126); cout << "\n\tLOCALISATION : 'creerClasse()'\n"; cout << "\n[DEBUG] 'nombre' dans creerClasse() : " << vect.back()->nombre; printf("\n[DEBUG] @'nombre' dans creerClasse() : 0x%08x", &vect.back()->nombre); printf("\n[DEBUG] @'cl' dans creerClasse() : 0x%08x\n", &cl); } int main() { Classe::creerClasse(); cout << "\n\tLOCALISATION : 'main()'\n"; cout << "\n[DEBUG] 'nombre' dans main() : " << Classe::vect.back()->nombre; printf("\n[DEBUG] @'nombre' dans main() : 0x%08x", &Classe::vect.back()->nombre); printf("\n[DEBUG] @'cl' dans main() : 0x%08x", Classe::vect.back()); printf ("\n[DEBUG] @'cl' dans main() en decimal : %d", Classe::vect.back()); cout << "\n\n"; return 0; }
LOCALISATION : 'creerClasse()' LOCALISATION : Constructeur de classe [DEBUG] 'nombre' dans constructeur de Classe() : 126 [DEBUG] @'nombre' dans constructeur de Classe() : 0x0022ff3c [DEBUG] @'cl' dans constructeur de Classe() : 0x0022ff38 LOCALISATION : 'creerClasse()' [DEBUG] 'nombre' dans creerClasse() : 126 [DEBUG] @'nombre' dans creerClasse() : 0x0022ff3c [DEBUG] @'cl' dans creerClasse() : 0x0022ff38 LOCALISATION : 'main()' [DEBUG] 'nombre' dans main() : 2293560 [DEBUG] @'nombre' dans main() : 0x0022ff3c [DEBUG] @'cl' dans main() : 0x0022ff38 [DEBUG] @'cl' dans main() en decimal : 2293560
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionIl me semblait que faire un membre static à l'intérieur de la classe était le moyen le plus propre (si ce n'est pas le cas je serais ravi d'apprendre pourquoi).
#include #include <list> template <typename T> class GenericAutoRef { public: typedef typename std::list<T*>::iterator iterator; GenericAutoRef() { _tab.push_back(static_cast<T*>(this));} ~GenericAutoRef() { _tab.remove(static_cast<T*>(this));} static iterator begin() { return _tab.begin(); } static iterator end() { return _tab.end(); } private: static std::list<T*> _tab; }; template <typename T> std::list<T*> GenericAutoRef<T>::_tab; class Class : public GenericAutoRef<Class> { public: Class(int i) : _i(i) {} virtual ~Class() {} int get() const { return _i;} private: const int _i; }; template <typename T> void showInstance() { std::cout << "Dump:" << std::endl; int nb = 0; for (typename GenericAutoRef<T>::iterator it = GenericAutoRef<T>::begin(); it != GenericAutoRef<T>::end(); ++it) { std::cout << *it << std::endl; ++nb; } std::cout << "Nb class = " << nb << std::endl; } int main() { showInstance<Class>(); Class* cl1 = new Class(1); showInstance<Class>(); Class* cl2 = new Class(2); showInstance<Class>(); Class* cl3 = new Class(3); showInstance<Class>(); { Class cl4(4); showInstance<Class>(); } showInstance<Class>(); delete cl1; showInstance<Class>(); delete cl2; showInstance<Class>(); delete cl3; showInstance<Class>(); return 0; }
Classe cl(1);
vect.push_back(&cl);
(c'est-à-dire que je met à jour le vector dans creerClasse() et pas dans le constructeur)
ça marche.