Accueil > > > SMART POINTEUR À COMPTEUR DE RÉFÉRENCE
SMART POINTEUR À COMPTEUR DE RÉFÉRENCE
Information sur la source
Description
Encore un pointeur intelligent, à compteur de référence, qui se comporte à l'utilisation comme un pointeur traditionnel. Attention, il n'est pas threadsafe. Il a été fait en Builder C++ 2007.
Source
- //******************************************************************************
- //! @file TSmartPtr.h
- //! @brief Gestion des pointeurs intelligents
- //******************************************************************************
-
- //******************************************************************************
- // Version : 01
- // Date : 11/2008
- // Auteurs : Nirgal76 / Totoche76
- // Description :
- // - Création de la classe
- //******************************************************************************
- #ifndef _TSmartPtrH
- #define _TSmartPtrH
-
- //******************************************************************************
- // MACROS
- //******************************************************************************
- #define SAFE_DELETE(p) { if (NULL!=p) { delete p; p=NULL; } }
- #define SAFE_DELETE_ARRAY(p) { if (NULL!=p) { delete[] p; p=NULL; } }
-
- //******************************************************************************
- // CONSTANTES
- //******************************************************************************
- const bool C_PTR_ARRAY = true; //!< Pointeur de base array
- const bool C_PTR_SINGLE = false; //!< Pointeur de base simple
-
- //******************************************************************************
- //! @class TSmartPtr
- //! @author Nirgal76
- //! @author Totoche76
- //! @date 11/2007
- //! @brief Classe de gestion de pointeurs intelligents
- //******************************************************************************
- template <typename T, bool Array = C_PTR_SINGLE>
- class TSmartPtr
- {
- //=====================================
- // PUBLIC
- //=====================================
- public :
- //------------------
- // CYCLE DE VIE
- //------------------
- // Constructeurs
- TSmartPtr();
- // Constructeurs par copie
- TSmartPtr(const TSmartPtr& rSmartPtr);
- // Constructeurs à partir d'un pointeur c++
- TSmartPtr(T* pPointer);
- // destructeur
- ~TSmartPtr();
-
- //------------------
- // OPERATEURS
- //------------------
- // Opérations sur le pointeur
- TSmartPtr& operator=(const TSmartPtr& rSmartPtr);
- TSmartPtr& operator=(T* pPointer);
- T& operator*();
- T* operator->();
- const T& operator*() const;
- const T* operator->() const;
- bool operator==(const TSmartPtr& rSmartPtr) const;
- bool operator!=(const TSmartPtr& rSmartPtr) const;
- operator T*(void) const;
-
- //=====================================
- // PRIVATE
- //=====================================
- private:
- //------------------
- // DONNEES
- //------------------
- int* mpRefCounter; //!< Nombre de référence sur le pointeur
- T* mpPointer; //!< Pointeur de base
-
- //------------------
- // METHODES
- //------------------
- // Destruteur (par comptage de référence)
- void Release();
- }; // fin de TSmartPtr
-
- //******************************************************************************
- //! @brief Constructeur
- //!
- //! @param Aucun
- //!
- //! @return Aucun
- //******************************************************************************
- template <typename T, bool Array>
- inline TSmartPtr<T, Array>::TSmartPtr()
- {
- mpRefCounter=NULL;
- mpPointer=NULL;
- }// fin du constructeur
-
- //******************************************************************************
- //! @brief Constructeur par copie
- //!
- //! @param rSmartPtr : pointeur intelligent à copier
- //!
- //! @return Aucun
- //******************************************************************************
- template <typename T, bool Array>
- inline TSmartPtr<T, Array>::TSmartPtr(const TSmartPtr<T, Array>& rSmartPtr)
- {
- mpPointer = rSmartPtr.mpPointer;
- mpRefCounter = rSmartPtr.mpRefCounter;
- if (NULL!=mpRefCounter)
- ++(*mpRefCounter);
- }// fin du constructeur par copie d'un pointeur intelligent
-
- //******************************************************************************
- //! @brief Constructeur par copie d'un pointeur de base
- //!
- //! @param pPointer : pointeur de base à copier
- //!
- //! @return Aucun
- //******************************************************************************
- template <typename T, bool Array>
- inline TSmartPtr<T, Array>::TSmartPtr(T* pPointer)
- {
- mpPointer=pPointer;
- if (NULL==mpPointer)
- mpRefCounter = NULL;
- else
- mpRefCounter = new int(1);
- }// fin du constructeur
-
- //******************************************************************************
- //! @brief Destructeur
- //!
- //! @param Aucun
- //!
- //! @return Aucun
- //******************************************************************************
- template <typename T, bool Array>
- inline TSmartPtr<T, Array>::~TSmartPtr()
- {
- Release();
- }// fin du destructeur
-
- //******************************************************************************
- //! @brief Opérateur d'affectation (=)
- //!
- //! @param rSmartPtr : pointeur intelligent source
- //!
- //! @return Le pointeur
- //******************************************************************************
- template <typename T, bool Array>
- inline TSmartPtr<T, Array>& TSmartPtr<T, Array>::operator=(const TSmartPtr<T, Array>& rSmartPtr)
- {
- Release();
-
- mpPointer = rSmartPtr.mpPointer;
- mpRefCounter = rSmartPtr.mpRefCounter;
- if (NULL!=mpRefCounter)
- ++(*mpRefCounter);
-
- return *this;
- }// fin de l'opérateur d'affectation
-
- //******************************************************************************
- //! @brief Opérateur d'affectation (=)
- //!
- //! @param pPointer : Pointeur de base
- //!
- //! @return Le pointeur
- //******************************************************************************
- template <typename T, bool Array>
- inline TSmartPtr<T, Array>& TSmartPtr<T, Array>::operator=(T* pPointer)
- {
- Release();
-
- mpPointer = pPointer;
- if (NULL==mpPointer)
- mpRefCounter = NULL;
- else
- mpRefCounter = new int(1);
-
- return *this;
- }// fin de l'opérateur d'affectation
-
- //******************************************************************************
- //! @brief Opérateur d'égalité (==)
- //!
- //! @param rSmartPtr : pointeur intelligent à comparer
- //!
- //! @return true si les pointeurs sont égaux
- //******************************************************************************
- template <typename T, bool Array>
- inline bool TSmartPtr<T, Array>::operator==(const TSmartPtr<T, Array>& rSmartPtr) const
- {
- return mpPointer == rSmartPtr.mpPointer;
- }// fin de l'opérateur d'égalité
-
- //******************************************************************************
- //! @brief Opérateur de non égalité (!=)
- //!
- //! @param rSmartPtr : pointeur intelligent à comparer
- //!
- //! @return true si les pointeurs sont différents
- //******************************************************************************
- template <typename T, bool Array>
- inline bool TSmartPtr<T, Array>::operator!=(const TSmartPtr<T, Array>& rSmartPtr) const
- {
- return mpPointer != rSmartPtr.mpPointer;
- }// fin de l'opérateur de non égalité
-
- //******************************************************************************
- //! @brief Renvoi la valeur du pointeur (opérateur *)
- //!
- //! @param Aucun
- //!
- //! @return Valeur du pointeur
- //******************************************************************************
- template <typename T, bool Array>
- inline T& TSmartPtr<T, Array>::operator*()
- {
- return *mpPointer;
- }// fin de l'opérateur de valeur
-
- //******************************************************************************
- //! @brief Renvoi la référence du pointeur (opérateur ->)
- //!
- //! @param Aucun
- //!
- //! @return Référence du pointeur
- //******************************************************************************
- template <typename T, bool Array>
- inline T* TSmartPtr<T, Array>::operator->()
- {
- return mpPointer;
- }// fin de l'opérateur de référence
-
- //******************************************************************************
- //! @brief Renvoi la référence du pointeur (opérateur *) en const
- //!
- //! @param Aucun
- //!
- //! @return Référence const du pointeur
- //******************************************************************************
- template <typename T, bool Array>
- inline const T& TSmartPtr<T, Array>::operator*() const
- {
- return *mpPointer;
- }// fin de l'opérateur de valeur
-
- //******************************************************************************
- //! @brief Renvoi la référence du pointeur (opérateur ->) en const
- //!
- //! @param Aucun
- //!
- //! @return Référence const du pointeur
- //******************************************************************************
- template <typename T, bool Array>
- inline const T* TSmartPtr<T, Array>::operator->() const
- {
- return mpPointer;
- }// fin de l'opérateur de référence
-
- //******************************************************************************
- //! @brief Casting sur le pointeur intelligent
- //!
- //! @param Aucun
- //!
- //! @return Pointeur de base
- //******************************************************************************
- template<typename T, bool Array>
- inline TSmartPtr<T, Array>::operator T*(void) const
- {
- return mpPointer;
- }// fin de l'opérateur de casting
-
- //******************************************************************************
- //! @brief Décrémente le compteur de référence et supprime le pointeur si = à 0
- //!
- //! @param Aucun
- //!
- //! @return Aucun
- //******************************************************************************
- template <typename T, bool Array>
- inline void TSmartPtr<T, Array>::Release()
- {
- if (NULL!=mpRefCounter)
- {
- (*mpRefCounter)--;
- if (*mpRefCounter <= 0)
- {// compteur = 0 => destruction du pointeur
- if (Array)
- {// tableau de pointeur
- SAFE_DELETE(mpRefCounter);
- SAFE_DELETE_ARRAY(mpPointer);
- }
- else
- {// pointeur
- SAFE_DELETE(mpRefCounter);
- SAFE_DELETE(mpPointer);
- }
- }// fin de compteur = 0
- }
- }// fin de Release
-
- #endif
//******************************************************************************
//! @file TSmartPtr.h
//! @brief Gestion des pointeurs intelligents
//******************************************************************************
//******************************************************************************
// Version : 01
// Date : 11/2008
// Auteurs : Nirgal76 / Totoche76
// Description :
// - Création de la classe
//******************************************************************************
#ifndef _TSmartPtrH
#define _TSmartPtrH
//******************************************************************************
// MACROS
//******************************************************************************
#define SAFE_DELETE(p) { if (NULL!=p) { delete p; p=NULL; } }
#define SAFE_DELETE_ARRAY(p) { if (NULL!=p) { delete[] p; p=NULL; } }
//******************************************************************************
// CONSTANTES
//******************************************************************************
const bool C_PTR_ARRAY = true; //!< Pointeur de base array
const bool C_PTR_SINGLE = false; //!< Pointeur de base simple
//******************************************************************************
//! @class TSmartPtr
//! @author Nirgal76
//! @author Totoche76
//! @date 11/2007
//! @brief Classe de gestion de pointeurs intelligents
//******************************************************************************
template <typename T, bool Array = C_PTR_SINGLE>
class TSmartPtr
{
//=====================================
// PUBLIC
//=====================================
public :
//------------------
// CYCLE DE VIE
//------------------
// Constructeurs
TSmartPtr();
// Constructeurs par copie
TSmartPtr(const TSmartPtr& rSmartPtr);
// Constructeurs à partir d'un pointeur c++
TSmartPtr(T* pPointer);
// destructeur
~TSmartPtr();
//------------------
// OPERATEURS
//------------------
// Opérations sur le pointeur
TSmartPtr& operator=(const TSmartPtr& rSmartPtr);
TSmartPtr& operator=(T* pPointer);
T& operator*();
T* operator->();
const T& operator*() const;
const T* operator->() const;
bool operator==(const TSmartPtr& rSmartPtr) const;
bool operator!=(const TSmartPtr& rSmartPtr) const;
operator T*(void) const;
//=====================================
// PRIVATE
//=====================================
private:
//------------------
// DONNEES
//------------------
int* mpRefCounter; //!< Nombre de référence sur le pointeur
T* mpPointer; //!< Pointeur de base
//------------------
// METHODES
//------------------
// Destruteur (par comptage de référence)
void Release();
}; // fin de TSmartPtr
//******************************************************************************
//! @brief Constructeur
//!
//! @param Aucun
//!
//! @return Aucun
//******************************************************************************
template <typename T, bool Array>
inline TSmartPtr<T, Array>::TSmartPtr()
{
mpRefCounter=NULL;
mpPointer=NULL;
}// fin du constructeur
//******************************************************************************
//! @brief Constructeur par copie
//!
//! @param rSmartPtr : pointeur intelligent à copier
//!
//! @return Aucun
//******************************************************************************
template <typename T, bool Array>
inline TSmartPtr<T, Array>::TSmartPtr(const TSmartPtr<T, Array>& rSmartPtr)
{
mpPointer = rSmartPtr.mpPointer;
mpRefCounter = rSmartPtr.mpRefCounter;
if (NULL!=mpRefCounter)
++(*mpRefCounter);
}// fin du constructeur par copie d'un pointeur intelligent
//******************************************************************************
//! @brief Constructeur par copie d'un pointeur de base
//!
//! @param pPointer : pointeur de base à copier
//!
//! @return Aucun
//******************************************************************************
template <typename T, bool Array>
inline TSmartPtr<T, Array>::TSmartPtr(T* pPointer)
{
mpPointer=pPointer;
if (NULL==mpPointer)
mpRefCounter = NULL;
else
mpRefCounter = new int(1);
}// fin du constructeur
//******************************************************************************
//! @brief Destructeur
//!
//! @param Aucun
//!
//! @return Aucun
//******************************************************************************
template <typename T, bool Array>
inline TSmartPtr<T, Array>::~TSmartPtr()
{
Release();
}// fin du destructeur
//******************************************************************************
//! @brief Opérateur d'affectation (=)
//!
//! @param rSmartPtr : pointeur intelligent source
//!
//! @return Le pointeur
//******************************************************************************
template <typename T, bool Array>
inline TSmartPtr<T, Array>& TSmartPtr<T, Array>::operator=(const TSmartPtr<T, Array>& rSmartPtr)
{
Release();
mpPointer = rSmartPtr.mpPointer;
mpRefCounter = rSmartPtr.mpRefCounter;
if (NULL!=mpRefCounter)
++(*mpRefCounter);
return *this;
}// fin de l'opérateur d'affectation
//******************************************************************************
//! @brief Opérateur d'affectation (=)
//!
//! @param pPointer : Pointeur de base
//!
//! @return Le pointeur
//******************************************************************************
template <typename T, bool Array>
inline TSmartPtr<T, Array>& TSmartPtr<T, Array>::operator=(T* pPointer)
{
Release();
mpPointer = pPointer;
if (NULL==mpPointer)
mpRefCounter = NULL;
else
mpRefCounter = new int(1);
return *this;
}// fin de l'opérateur d'affectation
//******************************************************************************
//! @brief Opérateur d'égalité (==)
//!
//! @param rSmartPtr : pointeur intelligent à comparer
//!
//! @return true si les pointeurs sont égaux
//******************************************************************************
template <typename T, bool Array>
inline bool TSmartPtr<T, Array>::operator==(const TSmartPtr<T, Array>& rSmartPtr) const
{
return mpPointer == rSmartPtr.mpPointer;
}// fin de l'opérateur d'égalité
//******************************************************************************
//! @brief Opérateur de non égalité (!=)
//!
//! @param rSmartPtr : pointeur intelligent à comparer
//!
//! @return true si les pointeurs sont différents
//******************************************************************************
template <typename T, bool Array>
inline bool TSmartPtr<T, Array>::operator!=(const TSmartPtr<T, Array>& rSmartPtr) const
{
return mpPointer != rSmartPtr.mpPointer;
}// fin de l'opérateur de non égalité
//******************************************************************************
//! @brief Renvoi la valeur du pointeur (opérateur *)
//!
//! @param Aucun
//!
//! @return Valeur du pointeur
//******************************************************************************
template <typename T, bool Array>
inline T& TSmartPtr<T, Array>::operator*()
{
return *mpPointer;
}// fin de l'opérateur de valeur
//******************************************************************************
//! @brief Renvoi la référence du pointeur (opérateur ->)
//!
//! @param Aucun
//!
//! @return Référence du pointeur
//******************************************************************************
template <typename T, bool Array>
inline T* TSmartPtr<T, Array>::operator->()
{
return mpPointer;
}// fin de l'opérateur de référence
//******************************************************************************
//! @brief Renvoi la référence du pointeur (opérateur *) en const
//!
//! @param Aucun
//!
//! @return Référence const du pointeur
//******************************************************************************
template <typename T, bool Array>
inline const T& TSmartPtr<T, Array>::operator*() const
{
return *mpPointer;
}// fin de l'opérateur de valeur
//******************************************************************************
//! @brief Renvoi la référence du pointeur (opérateur ->) en const
//!
//! @param Aucun
//!
//! @return Référence const du pointeur
//******************************************************************************
template <typename T, bool Array>
inline const T* TSmartPtr<T, Array>::operator->() const
{
return mpPointer;
}// fin de l'opérateur de référence
//******************************************************************************
//! @brief Casting sur le pointeur intelligent
//!
//! @param Aucun
//!
//! @return Pointeur de base
//******************************************************************************
template<typename T, bool Array>
inline TSmartPtr<T, Array>::operator T*(void) const
{
return mpPointer;
}// fin de l'opérateur de casting
//******************************************************************************
//! @brief Décrémente le compteur de référence et supprime le pointeur si = à 0
//!
//! @param Aucun
//!
//! @return Aucun
//******************************************************************************
template <typename T, bool Array>
inline void TSmartPtr<T, Array>::Release()
{
if (NULL!=mpRefCounter)
{
(*mpRefCounter)--;
if (*mpRefCounter <= 0)
{// compteur = 0 => destruction du pointeur
if (Array)
{// tableau de pointeur
SAFE_DELETE(mpRefCounter);
SAFE_DELETE_ARRAY(mpPointer);
}
else
{// pointeur
SAFE_DELETE(mpRefCounter);
SAFE_DELETE(mpPointer);
}
}// fin de compteur = 0
}
}// fin de Release
#endif
Conclusion
Reste à le déclarer. Par exemple, pour déclarer un pointeur sur une classe TMaClasse : TSmartPtr<TMaClasse> mpMaClasse;
mpMaClasse=new TMaClasse; // Instanciation de TMaClasse mpMaClasse->Initialiser(); // Fonction membre de TMaClasse ...
Et ensuite, l'utiliser comme un pointeur traditionnel. sauf qu'il n'y a pas à le deleter bien entendu. Si l'on veut vraiment le supprimer explicitement, lui affecter NULL.
Historique
- 08 décembre 2009 11:49:03 :
- Mise à jour des auteurs du code
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
les template [ par FlyFucker ]
Bonjour,peut on se servir d'un struct en temps que type d'un template !car avec le template que j'ai fait, au moment de l'integration dans mon program
convertir pointeur int* en reference int& ??? je fais quoi ? [ par equimose ]
j'ai une fonction qui prend comme parametre une CMyLigne & ABet j'ai besoin d'envoyer a cette fonction un pointeur sur une CMyLigne * pLigne !c'es
Unresolved external symbol [ par neodelphi ]
Bonsoir, c'est encore moi et mes problèmes de c++ !Je vais essayer de faire cour:J'ai une classe template dans un fichier .hpp (déclara
[C] Pointeur int comme paramètre dans une function qui ne marche pas [ par nitrique ]
Bonjour à tous,J'ai retourné les pointeurs dans tous les sens mais rien n'y fait.J'aimerais modifier la valeur d'une variable int à l'i
Utilisation d'un pointeur de fonction membre [ par cyrcocq ]
Bonjour,J'ai déjà discuté de ça ailleurs, on m'a conseillé d'autres méthodes, mais imaginons une classe contenant un ens
reference nulle [ par Binabik ]
salut tout le monde,est ce que quelqu'un sait comment retourner une reference nulle en c++?merci ^^.vive les grottes
Pointeur de Fonction [ par Ombitious_Developper ]
Salut : Mon probléme est le suivant :Etant donné une classe class TMyClass{ // données membres public : void  
[C] [Dev-cpp] undefinied reference to URLDownloadToFile [ par shadow1779 ]
Bonjour,voila j'ai encore un probleme d'undefinied reference : la c'est un undefinied reference to URLDownloadToFile, avec Dev-cpp en programmation C,
[C#] récupérer la position du pointeur [ par Napalm51 ]
Bonjour, en fait j'essaye de developper un programme qui ouvre un fichier texte, l'affiche dans une RichTextBox, et qd un utilisateur surligne une par
Pointeurs de pointeurs [ par miximog ]
Bonjour a tous enfin bonsoir ;) Enfaîte j'ai lu 2 tuto sur les pointeurs donc je commence a bien comprendre la notion de pointeurs, mais il y a
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|