Probleme de linkage d'un attribut static

Probleme de linkage d'un attribut static - C++ - Programmation

Marsh Posté le 09-02-2006 à 22:51:50    

Salut,
 
   J'ai un message d'erreur :  "[Linker error] undefined reference to `handle<int>::current' "
 
Mon but est en gros de faire une classe qui represente un auto_ptr pour cela un ptr n'encapsule pas directement un T*, mais passe par un "handle" qui compte le nombre de pointeurs qui referencent l'objet pointee.
 

Code :
  1. template <typename T>
  2. struct handle {  // Doit etre un signleton pour chaque instance differente de pt
  3.       int nb; // nombre de references   
  4.       T*  pt; // l'objet pointe par pt
  5.       static handle<T>* current;
  6.      
  7.       static handle<T>* get_instance(T* _pt){
  8.           // Si creation d'un pointeur sur le même objet
  9.           if ( current != NULL && current->pt == _pt ) {
  10.              // on augmente le nombre
  11.              current->add_ref();
  12.              // On renvoi le pointeur précedament enregistré
  13.              return current;
  14.           } else {
  15.              return new handle<T>(1,_pt);   
  16.           }
  17.       }
  18.      
  19.       // Constructeur
  20.       handle(int _nb = 0, T* _pt = 0){
  21.                    nb = _nb;
  22.                    pt = _pt;
  23.                    current = this;   
  24.       }
  25.       // Destructeur
  26.       ~handle(){
  27.           if ( pt != NULL ) delete pt;
  28.       }
  29.       // Ajout d'une reference
  30.       void add_ref(){
  31.            nb++;
  32.       }
  33.       // Suppression d'une reference
  34.       void del_ref(){
  35.            nb--;
  36.            if( nb == 0 && pt != NULL ) delete pt;
  37.       }
  38.       // Accesseur sur pt
  39.       T* get_pt(){ return pt; }
  40.       // Get number
  41.       int get_nb(){ return nb; }   
  42. };
  43. // Classe representant un pointeur
  44. template <typename T>
  45. class ptr {     
  46.       public:                                                                                                                                                                                     
  47.              // Constructeur
  48.              ptr(T* _pt = 0){
  49.                     ref = handle<T>::get_instance(_pt);
  50.              }           
  51.              // Destructeur
  52.              ~ptr(){
  53.                     if ( ref != NULL ) delete ref;
  54.              }
  55.            
  56.              // Operateur =
  57.              ptr& operator=(const ptr<T>& r) {
  58.                   if ( (void*)&r != (void*)this ){ // si il n'y a pas d'affecations de this à lui meme
  59.                      ref->del_ref();
  60.                      ref = r.ref;
  61.                   }
  62.                   return *this;
  63.              }     
  64.            
  65.              int get_total(){
  66.                  return ref->get_nb();
  67.              }           
  68.              // Operateur *             
  69.              // Operateur ->
  70.            
  71.       private:             
  72.              // Le handle
  73.              handle<T>* ref;                                   
  74. };


 
Donc dans le main L'erreur vient surement de l'appel :   int i = 3;  ptr<int> p1(&i);
 
J'ai testé de mettre la struct directement à l'interieur de la classe ptr mais sans succés.
 
Une idée ?


Message édité par Chronoklazm le 09-02-2006 à 23:04:14

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 09-02-2006 à 22:51:50   

Reply

Marsh Posté le 09-02-2006 à 23:40:17    

tu dois definir handle<T>::current

Code :
  1. template <typename T> handle<T>::current = 0;


l'ideal serait que le type handle soit encapsulé (en private) dans ptr
 
pourquoi tu as besoin de faire ca, ca existe deja ?

Reply

Marsh Posté le 09-02-2006 à 23:47:26    

C'est pour un tp à la faque.
 
J'ai mis cette ligne juste pares la définition du handle et il n'a pas l'air d'apprécier.
"75 ptr.h expected constructor, destructor, or type conversion before '=' token "


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 09-02-2006 à 23:50:37    

oui j'ai oublié l'étoile, c'est un pointeur
 
edit:

Code :
  1. template <typename T> handle<T> * handle<T>::current = 0;


Message édité par skelter le 09-02-2006 à 23:51:27
Reply

Marsh Posté le 09-02-2006 à 23:56:28    

Merci skelter :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Sujets relatifs:

Leave a Replay

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