Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1655 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Membre object statique dans classe template : souci

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Membre object statique dans classe template : souci

n°2270504
iVador
Posté le 27-11-2015 à 15:07:03  profilanswer
 

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
mood
Publicité
Posté le 27-11-2015 à 15:07:03  profilanswer
 

n°2270541
Farian
Posté le 28-11-2015 à 17:59:51  profilanswer
 

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 !

n°2270584
iVador
Posté le 30-11-2015 à 16:57:13  profilanswer
 

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 :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Membre object statique dans classe template : souci

 

Sujets relatifs
Souci pour exécuter fonction ajax au chargement de la pageLancement fonctions dont le nom est en variable dans une classe....
[Aide] convertir balise <iframe> en <object>Variadic template [résolu]
[C#] Problème récup fabrique de la classe COMClasse fille contenant une liste d'objet de classe mere?
[ASP] attribuer un lien statique à une vidéoclasse fichier SVP
Créer une classe ayant le comportement d'une classe interne[résolu] Problème de récupération d'une valeur en BDD
Plus de sujets relatifs à : Membre object statique dans classe template : souci


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR