Membre object statique dans classe template : souci

Membre object statique dans classe template : souci - C++ - Programmation

Marsh Posté le 27-11-2015 à 15:07:03    

Bonjour,
 
j'ai un souci de C++.
 
je cherche a resoudre un probleme d'initialisation, car le constructeur d'un objet membre statique d'une classe template que j'ai definie n'est jamais appelé.
J'ai reproduit mon probleme sur un test case tres simple :
 
Voici la classe de test :
 
simple_class.hpp

Code :
  1. #ifndef _SIMPLE_CLASS_HPP_
  2. #define _SIMPLE_CLASS_HPP_
  3. class simple_class
  4. {
  5.   public:
  6.  
  7.     simple_class();
  8.    
  9.     unsigned int m_integer;
  10. };
  11. #endif


 
simple_class.cpp:
 

Code :
  1. #include "simple_class.hpp"
  2.  
  3. simple_class::simple_class():
  4.   m_integer(0)
  5. {
  6.     std::cout << "SIMPLE CLASS CONSTRUCTOR with integer id: " << m_integer << std::endl;
  7. }


 
Ma classe template est template_test.hpp:
 

Code :
  1. #ifndef _TEMPLATE_TEST_HPP_
  2. #define _TEMPLATE_TEST_HPP_
  3. /*------------------------------------------------------------------------------
  4. * Includes
  5. *----------------------------------------------------------------------------*/
  6. #include <cstdlib>
  7. #include "simple_class.hpp"
  8. template<typename T>
  9. class template_test
  10. {
  11.   public:
  12.  
  13.     template_test() {};
  14.  
  15.     static const unsigned int get_id() { return id; }
  16.    
  17.     static const unsigned int get_object_id() { return static_object.m_integer; }
  18.    
  19.   protected:
  20.  
  21.     static const unsigned int id;
  22.    
  23.     static simple_class static_object;
  24. };
  25. //Static member initialization
  26. template<typename T>
  27. const unsigned int template_test<T>::id = 1;
  28. //the simple_class constructor should be called here ...
  29. template<typename T>
  30. simple_class template_test<T>::static_object;
  31. #endif


 
Comme on peut le voir, je declare un objet de la classe simple_class comme membre statique de ma classe template et je le definis en dehors de la declaration de la classe template.
 
Je m'attends a ce que ceci suffise pour que le constructeur de simple_class soit appelé avant le main, l'objet etant statique, et m'affiche le message de son constructeur.
 
J'instancie le template a l'aide d'une classe derivee :
 
concrete_test.cpp  

Code :
  1. #include <iostream>
  2. #include "template_test.hpp"
  3. class concrete_test : public template_test<unsigned int>
  4. {
  5.   public:
  6.  
  7.     concrete_test();
  8.    
  9.     void display();
  10. };


 
le display est defini dans concrete_test.cpp ..
 
enfin le main donne :
 

Code :
  1. int main(int argc, char * argv[])
  2. {
  3.   std::cout << " TEST PROGRAM " << std::endl;
  4.   std::cout << "concrete static id is " << concrete_test::get_id() << std::endl;
  5.   //std::cout << "concrete static simple class id is " << concrete_test::get_object_id() << std::endl; (*)
  6. }


 
Il se trouve que si je laisse la ligne (*) en commentaire, le constructeur de mon objet statique n'est jamais appelé :
 
./test
 TEST PROGRAM  
concrete static id is 1
 
mais si je la decommente :
 
./test
SIMPLE CLASS CONSTRUCTOR with integer id: 0
 TEST PROGRAM  
concrete static id is 1
concrete static simple class id is 0
 
 
Est ce que quelqu'un peut m'aider a comprendre ce qu'il se passe avec mon objet statique ? pourquoi n'est il pas traite de la meme maniere que le membre statique integer de la meme classe template ?
 
faut il necessairement faire un appel de methode traitant l'objet statique pour que celui ci soit initialisé ?
 
Merci :)


Message édité par iVador le 27-11-2015 à 15:08:41
Reply

Marsh Posté le 27-11-2015 à 15:07:03   

Reply

Marsh Posté le 28-11-2015 à 17:59:51    

bonjour !
 
De mémoire, il me semble que, dans le cas des templates, seules les méthodes (et donc, a priori les membres statiques) qui sont réellement utilisés dans le code généré sont effectivement compilés, ce qui correspond à votre analyse (et au résultat !)
 
On s'en rend compte quand on découvre des erreurs de syntaxe dans la classe template au fur et à mesure qu'on en utilise les méthodes, au lieu de les découvrir dès la première utilisation de la classe.
 
Bonne continuation !

Reply

Marsh Posté le 30-11-2015 à 16:57:13    

merci beaucoup pour ta reponse :)
 
du coup je n'ai pas trouvé d'autre solution que de mettre la variable static en privé dans le template, de la redeclarer dans la classe derivant d'une instatiation de ce template, et de la definir dans le .cpp de celle ci
sur ce coup la plus de souci , et ce qui m'evite de devoir appeler une methode agissant sur cette variable :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed