Soyez le premier à donner votre avis sur cette source.
Snippet vu 6 637 fois - Téléchargée 22 fois
#ifndef _IPointer_H #define _IPointer_H #include <map> template<class T> class IPointer { public : //destructeur ~IPointer()throw(); //constructeur par defaut IPointer() : m_Ptrs((T*)0) {} //constructer par pointeur IPointer(T* Ptr); //constructeur par copie IPointer(const IPointer& Ptr); //operateur de déferencement T& operator * ()const ; T* operator ->()const ; //operateur de positionnement T operator -- (int) ; T operator ++ (int) ; //operateur de renvoit operator T*() const ; //operateur = const IPointer& operator =(const IPointer& Ptr) ; const IPointer& operator = (T* Ptr) ; //echange d'addresse void AddressSwap( IPointer& Ptr) ; //echange de valeur void ValueSwap( IPointer& Ptr) ; //comparéson de valeur bool ValueCmp(const IPointer& Ptr) ; private: // pointeur T* m_Ptrs; //map de sauvegarde addresse typedef std::map< IPointer*,T*>mapBlock; mapBlock Block; }; ////////////////////////////////////// //destructeur // // suprime la savegarde pointeur ////////////////////////////////////// template<class T>inline IPointer<T>::~IPointer()throw() { delete Block[this]; } ////////////////////////////////////////// //constructeur par pointeur // // copie l'address pointé dans Block // initialise le pointeur sur l'addresse pointé ////////////////////////////////////////////// template<class T>inline IPointer<T>::IPointer(T* Ptr) { Block[this]=Ptr; m_Ptrs=Ptr; } //////////////////////////////////////////////// // constructeur par copie // // copie l'address pointé dans Block // initialise le pointeur sur l'addresse pointé ////////////////////////////////////////////// template<class T>inline IPointer<T>::IPointer(const IPointer<T>& Ptr) { Block[this]=Ptr; m_Ptrs=Ptr; } //////////////////////////////////////////// //operateur de renvoit // // retourne la valeur pointée // // throw pointeur non initialisé ////////////////////////////////////////////// template<class T>inline T& IPointer<T>::operator * ()const { if(m_Ptrs!=(T*)0) return *m_Ptrs; throw m_Ptrs; } //////////////////////////////////////////////////// //opérateur d'accès // // renvoie pointeur constant sur la donner ////////////////////////////////////////////////////// template<class T>inline T* IPointer<T>::operator ->()const { if(m_Ptrs!=(T*)0) return m_Ptrs; throw m_Ptrs; } //////////////////////////////////////////////////// //opérateur ++ // // positionne le pointeur dans le tableau de +1 ////////////////////////////////////////////////////// template<class T>inline T IPointer<T>::operator ++ (int) { if(m_Ptrs!=(T*)0) m_Ptrs++; } //////////////////////////////////////////////////// //opérateur -- // // positionne le pointeur dans le tableau de -1 ////////////////////////////////////////////////////// template<class T>inline T IPointer<T>::operator -- (int) { if(m_Ptrs!=(T*)0) m_Ptrs--; } ////////////////////////////////////////////////////// //opérateur de renvoit // //retourne le pointeur constant //////////////////////////////////////////////////////// template<class T>inline IPointer<T>::operator T*() const { return m_Ptrs; } //////////////////////////////////////////////////////////////// //opérateur égale //////////////////////////////////////////////////////////////// template<class T>inline const IPointer<T>& IPointer<T>::operator =(const IPointer<T>& Ptr) { Block[this]=Ptr.m_Ptrs; m_Ptrs=Ptr.m_Ptrs; return *this; } //////////////////////////////////////////////////////////////// //opérateur égale //////////////////////////////////////////////////////////////// template<class T>inline const IPointer<T>& IPointer<T>::operator = (T* Ptr) { if(m_Ptrs!=Ptr) { Block[this]=Ptr; m_Ptrs=Ptr; } return *this; } //////////////////////////////////////////////////////////////// //fonction AddressSwap() // //échange d'addresse pointé //////////////////////////////////////////////////////////////// template<class T>inline void IPointer<T>::AddressSwap( IPointer& Ptr) { T* tem= m_Ptrs; m_Ptrs= Ptr.m_Ptrs; Ptr.m_Ptrs=tem; } //////////////////////////////////////////////////////////////// //fonction ValueSwap() // //échange de valeur pointé //////////////////////////////////////////////////////////////// template<class T>inline void IPointer<T>::ValueSwap( IPointer& Ptr) { if(m_Ptrs==((T*)0)||Ptr.m_Ptrs==((T*)0)) throw(m_Ptrs,Ptr.m_Ptrs); T tem= *m_Ptrs;
23 déc. 2009 à 18:57
16 déc. 2009 à 14:30
IPointer ptrMagique(&(new int[BCP]));
IPointer ptrMagique = &(new int[BCP]);
C'est l'addresse du pointeur qui est prise comme argument et non pas le pointeur. XD
16 déc. 2009 à 14:22
IPointer::IPointer(T **ppT)
{
m_Ptrs = *pT;
*pT = 0;
}
IPointer::IPointer(const T **ppT)
{
m_Ptrs = *pT;
}
Le deuxième constructeur sera dans le cas du:
IPointer ptrMagique(new int[BCP]);
ou sont equivalent puisque le constructeur n'est pas déclaré "explicit"
IPointer ptrMagique = new int[BCP];
Tu vois c'est avant tout savoir l'utilisation du pointeur avant de créer la classe mais puisque c'est un util d'apprentissage je te comprends fort bien. Moi pour apprendre les templates j'ai créer mon propre array dynamique (mieux connu sous le nom dans STL de std::vector) :D.
7 déc. 2009 à 22:57
Par exemple boost.shared_ptr, boost.scoped_ptr, etc ...
3 déc. 2009 à 11:59
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.