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 :
- #ifndef _SIMPLE_CLASS_HPP_
- #define _SIMPLE_CLASS_HPP_
- class simple_class
- {
- public:
-
- simple_class();
-
- unsigned int m_integer;
- };
- #endif
|
simple_class.cpp:
Code :
- #include "simple_class.hpp"
-
- simple_class::simple_class():
- m_integer(0)
- {
- std::cout << "SIMPLE CLASS CONSTRUCTOR with integer id: " << m_integer << std::endl;
- }
|
Ma classe template est template_test.hpp:
Code :
- #ifndef _TEMPLATE_TEST_HPP_
- #define _TEMPLATE_TEST_HPP_
- /*------------------------------------------------------------------------------
- * Includes
- *----------------------------------------------------------------------------*/
- #include <cstdlib>
- #include "simple_class.hpp"
- template<typename T>
- class template_test
- {
- public:
-
- template_test() {};
-
- static const unsigned int get_id() { return id; }
-
- static const unsigned int get_object_id() { return static_object.m_integer; }
-
- protected:
-
- static const unsigned int id;
-
- static simple_class static_object;
- };
- //Static member initialization
- template<typename T>
- const unsigned int template_test<T>::id = 1;
- //the simple_class constructor should be called here ...
- template<typename T>
- simple_class template_test<T>::static_object;
- #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 :
- #include <iostream>
- #include "template_test.hpp"
- class concrete_test : public template_test<unsigned int>
- {
- public:
-
- concrete_test();
-
- void display();
- };
|
le display est defini dans concrete_test.cpp ..
enfin le main donne :
Code :
- int main(int argc, char * argv[])
- {
- std::cout << " TEST PROGRAM " << std::endl;
- std::cout << "concrete static id is " << concrete_test::get_id() << std::endl;
- //std::cout << "concrete static simple class id is " << concrete_test::get_object_id() << std::endl; (*)
- }
|
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