vincent0 | Hello.
J'ai fait une classe de pointeur intelligent avec compteur de référence et j'aimerais bien savoir ce que vous en pensez.
Code :
- struct arrayPtr{static bool array;};
- bool arrayPtr::array = true;
- struct noArrayPtr{static bool array;};
- bool noArrayPtr::array = false;
- template <class T, class Policy = noArrayPtr> class CSmartPtr
- {
- public:
- //Constructors and destructor :
- CSmartPtr(void);
- CSmartPtr(T *Pointer);
- CSmartPtr(const CSmartPtr & );
- ~CSmartPtr(void);
- //Others operators on the pointers :
- const CSmartPtr& operator=(const CSmartPtr & );
- T* operator->(void) const;
- T& operator*(void) const;
- T** operator&(void) const;
- //Comparison :
- bool operator==(const T & ) const;
- bool operator!=(const T & ) const;
- bool operator!(void) const;
- //Casting :
- operator T*(void) const;
- private:
- T *data;
- int *ref;
- };
- //-----------------------------------------------------------------------
- // Constructors and destructor
- //-----------------------------------------------------------------------
- template<class T, class Policy> inline CSmartPtr<T, Policy>::CSmartPtr(void) : data(NULL), ref(NULL)
- {
- }
- template<class T, class Policy> inline CSmartPtr<T, Policy>::CSmartPtr(T *pointer) : data(pointer), ref(new int(1))
- {
- }
- template<class T, class Policy> inline CSmartPtr<T, Policy>::CSmartPtr(const CSmartPtr ©) : data(copy.data), ref(copy.ref)
- {
- if(ref)
- (*ref)++;
- }
- template<class T, class Policy> inline CSmartPtr<T, Policy>::~CSmartPtr(void)
- {
- if(ref && (--(*ref) == 0))
- {
- delete ref;
- if(Policy::array)
- delete [] data;
- else
- delete data;
- }
- }
- //-----------------------------------------------------------------------
- // Others operators on the pointers
- //-----------------------------------------------------------------------
- template<class T, class Policy> inline const CSmartPtr<T, Policy>& CSmartPtr<T, Policy>::operator=(const CSmartPtr ©)
- {
- if(ref && (--(*ref) == 0))
- {
- delete ref;
- if(Policy::array)
- delete [] data;
- else
- delete data;
- }
- data = copy.data;
- ref = copy.ref;
- if(ref)
- (*ref)++;
- return *this;
- }
- template<class T, class Policy> inline T* CSmartPtr<T, Policy>::operator->(void) const
- {
- return data;
- }
- template<class T, class Policy> inline T& CSmartPtr<T, Policy>::operator*(void) const
- {
- return *data;
- }
- template<class T, class Policy> inline T** CSmartPtr<T, Policy>::operator&(void) const
- {
- return &data;
- }
- //-----------------------------------------------------------------------
- // Comparison
- //-----------------------------------------------------------------------
- template<class T, class Policy> inline bool CSmartPtr<T, Policy>::operator==(const T &other) const
- {
- return (data == other.data);
- }
- template<class T, class Policy> inline bool CSmartPtr<T, Policy>::operator!=(const T &other) const
- {
- return !(data == other.data);
- }
- template<class T, class Policy> inline bool CSmartPtr<T, Policy>::operator!(void) const
- {
- return data == 0;
- }
- //-----------------------------------------------------------------------
- // Casting
- //-----------------------------------------------------------------------
- template<class T, class Policy> inline CSmartPtr<T, Policy>::operator T*(void) const
- {
- return data;
- }
|
- Voyez-vous des erreurs ou des améliorations possible à faire ?
- Y a-t-il des choses que l'ont peut faire avec un pointeur normal et qu'ont ne peut pas faire avec ma classe ?
Quand je fait ceci, j'ai une erreur à la compilation, comment pourrait-je régler le problème ? :
CSmartPtr<float> pf;
CSmartPtr<int> pi2(new int);
pf = (float *)pi2;
En vous remerciant. Message édité par vincent0 le 03-12-2006 à 23:20:36
|