IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

SmartPointer non fonctionnel


Sujet :

C++

  1. #41
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est exprès que tu définis une conversion implicite?

  2. #42
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Non plus. J'ai tapé le truc à la va-vite car je voulais surtout mettre en évidence l'idiome copy-swap (ce à quoi j'ai magnifiquement échoué parce que j'ai mis un const de trop )...

    J'ai corrigé, et je viens d'en profiter pour rajouter un constructeur par défaut.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #43
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    template< class T >
    class CSmartPointer
    {
    public:
    	CSmartPointer(void)
    	 : p(NULL), pr(NULL)
    	{ }
    	CSmartPointer(CSmartPointer const &src)
    	 : p(src.p), pr(src.pr)
    	{
    		(*pr)++;
    	}
     
    private:
    	T *p;
    	int *pr;
    };
    Edit: Menues corrections.
    On ne peut pas copier un CSmartPointer défaut-initialisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CSmartPointer<int> p (CSmartPointer ());
    déréférence un pointeur nul!

  4. #44
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    re-re-re-corrigé!

    Dis, quand on aura fini, on pourra supprimer les postes de corrections ? Ils me dépriment un peu...
    (d'un autre côté, je n'ai jamais voulu cacher que c'était codé sur le pouce)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #45
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    re-re-re-corrigé!

    Dis, quand on aura fini, on pourra supprimer les postes de corrections ? Ils me dépriment un peu...
    (d'un autre côté, je n'ai jamais voulu cacher que c'était codé sur le pouce)
    Oui, j'y avais pensé.

    Pourquoi (void)? Pourquoi pas ()?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	explicit CSmartPointer(T *p)
    	{
    		this->p = p;
    		this->pr = new int(1);
    	}
    Pourquoi pas d'init-list?

  6. #46
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1. L'habitude de la différence entre () et (void) en C, je préfère mettre systématiquement (void).
    2. Et donc, ça, ça marche, ça compilera et ça fera exactement ce qu'on veut que ça fasse ? (hormis le contrôle sur les exceptions)
      Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      	explicit CSmartPointer(T *p)
      	 : p(p), pr(new int(1))
      	{ }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #47
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    1. L'habitude de la différence entre () et (void) en C, je préfère mettre systématiquement (void).
    2. Et donc, ça, ça marche, ça compilera et ça fera exactement ce qu'on veut que ça fasse ? (hormis le contrôle sur les exceptions)
      Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      	explicit CSmartPointer(T *p)
      	 ; p(p), pr(new int(1))
      	{ }
    2 : Hormis un échec de new, et le ";" au lien de ":", oui, ça fait ce qu'on veut.

  8. #48
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par corrector
    Oui. C'est justement le cas typique où on nomme un paramètre comme un membre, exprès : quand le membre est initialisé par le paramètre. C'est idiomatique, et probablement le seul cas où j'admettrai le masquage de noms de variables
    Je ne sais pas pourquoi mais j'avais en tête que ce n'étais pas possible, j'ai du le vérifier pour le croire , mais au final je suppose qu'il est quand même plus clair d'avoir deux noms différents et ça ne coute pas bien cher non... (enfin je suppose que c'est une question de choix personel)...?
    Citation Envoyé par corrector
    C'est très vraisemblablement ce voudra l'utilisateur, même si ce n'est techniquement pas commit-or-rollback, donc le constructeur lui-même n'est pas strong exception safe, mais il faut considérer le contexte d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CSmartPointer<T> p (new T);
    Si CSmartPointer (T*) garanti la prise en charge même en cas d'échec ("fail-and-commit"), alors la déclaration de p est strong exception safe : soit l'objet créé est pris en charge par un CSmartPointer, soit tout est nettoyé
    Je ne suis pas sûr de tout saisir (), quelle serait le code adapté alors... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CSmartPointer(T *_p) : p(_p)
    {
    	try{
    		this->pr = new int(1);
    	}
    	catch(bad_alloc &) {
    		delete p;
    		throw;
    	}
    }
    Dans ce cas précis, la gestion d'un bloc catch_try ne coûte pas trop cher en terme de performance?
    Juste par curiosité, dans quelle cas ce genre d'exception arrive en général (je n'ai jamais été confronté à ce problème )?
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  9. #49
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Et tant qu'à faire, n'est-il pas préférable d'éviter les exceptions justement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSmartPointer(T *_p) : p(_p), pr(new(nothrow) int(1))
    {
    }
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  10. #50
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans un constructeur, pas trop.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #51
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Et tant qu'à faire, n'est-il pas préférable d'éviter les exceptions justement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSmartPointer(T *_p) : p(_p), pr(new(nothrow) int(1))
    {
    }
    Montre moi ta ré-écriture de toute la classe CSmartPointer.

  12. #52
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Je retire ce que j'ai dit sur le nothrow () la suite de mon code est basé sur un compteur sencé être alloué correctement donc... voila le code complet de ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    template <class T>
    class CSmartPointer
    {
    public:
     
    	CSmartPointer(T *Pointer = NULL);
    	CSmartPointer(CSmartPointer<T> const &SmartPointer);
     
    	~CSmartPointer();
     
    	CSmartPointer<T> & operator = (CSmartPointer<T> const &SmartPointer);
    	CSmartPointer<T> & operator = (T *Pointer);
    	bool operator () ();
    	T const * const operator -> () const;
    	T * const operator -> ();
    	T const & operator * () const;
    	T & operator * ();
     
    	operator T const * const() const;
    	operator T * const();
     
    	void Swap(CSmartPointer<T> &SmartPointer);
     
    	template <class Other>
    	operator CSmartPointer<Other>() const;
     
    private:
     
    	T		*m_Pointer;			// Pointer on the object
    	int		*m_Counter;			// Counter on the object pointed
    };
    Et l'implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    template <class T>
    inline CSmartPointer<T>::CSmartPointer(T *Pointer) : m_Pointer(Pointer), m_Counter(NULL)
    {
    	try{
    		m_Counter = new int(1);
    	}
    	catch(std::bad_alloc &) {
    		SAFE_DELETE(m_Pointer);
    		throw;
    	}
    }
     
     
    template <class T>
    inline CSmartPointer<T>::CSmartPointer(CSmartPointer<T> const &SmartPointer) : m_Pointer(SmartPointer.m_Pointer), m_Counter(SmartPointer.m_Counter)
    {
    	++(*m_Counter);
    }
     
    template <class T>
    inline CSmartPointer<T>::~CSmartPointer()
    {
    	if( --(*m_Counter) == 0 )
    	{
    		delete m_Pointer;
    		delete m_Counter;
    	}
    }
     
    template <class T>
    inline CSmartPointer<T> & CSmartPointer<T>::operator = (CSmartPointer<T> const &SmartPointer)
    {
    	CSmartPointer<T> CopyTmp(SmartPointer);
    	Swap(CopyTmp);
    	return *this;
    }
     
    template <class T>
    inline CSmartPointer<T> & CSmartPointer<T>::operator = (T *Pointer)
    {
    	CSmartPointer<T> CopyTmp(Pointer);
    	Swap(CopyTmp);
    	return *this;
    }
     
    template <class T>
    inline bool CSmartPointer<T>::operator () ()
    {
    	return(m_Pointer!=NULL);
    }
     
    template <class T>
    inline T const * const CSmartPointer<T>::operator -> () const
    {
    	Assert( m_Pointer != NULL );
    	return m_Pointer;
    }
     
    template <class T>
    inline T * const CSmartPointer<T>::operator -> ()
    {
    	Assert( m_Pointer != NULL );
    	return m_Pointer;
    }
     
    template <class T>
    inline T const & CSmartPointer<T>::operator * () const
    {
    	Assert( m_Pointer != NULL );
    	return (*m_Pointer);
    }
     
    template <class T>
    inline T & CSmartPointer<T>::operator * ()
    {
    	Assert( m_Pointer != NULL );
    	return (*m_Pointer);
    }
     
    template <class T>
    inline CSmartPointer<T>::operator T const * const() const
    {
    	return m_Pointer;
    }
     
    template <class T>
    inline CSmartPointer<T>::operator T * const()
    {
    	return m_Pointer;
    }
     
    template <class T>
    inline void CSmartPointer<T>::Swap(CSmartPointer<T> &SmartPointer)
    {
    	std::swap(m_Pointer, SmartPointer.m_Pointer);
    	std::swap(m_Counter, SmartPointer.m_Counter);
    }
     
    template <class T>
    template <class Other>
    inline CSmartPointer<T>::operator CSmartPointer<Other>() const
    {
    	Other *Pointer = (Other *)m_Pointer;
     
    	return CSmartPointer<Other>(Pointer);		
    }
    Je ne suis pas encore bien habitué au mot clé explicit mais dans mon projet j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SceneManager.AddCamera( new CCamera(*this) );
    Avec AddCamera prenant un smart pointer (de CCamera) en paramètre, dans ce cas il faut bien utiliser le constructeur en tant que conversion implicite non?
    Enfin si vous avez d'autres conseils ou critiques sur le code je suis preneur encore merci à tous

    NOTE : l'opérateur de conversion n'a pas encore était testé(), je ne suis pas sur que ce soit très correct (enfin j'y viendrai...)
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  13. #53
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je pense que tu peux utiliser le swap aussi sur operator= (T*).
    Et aussi, je te pose la question avant corrector: Constructeur implicite, c'est voulu ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #54
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Médinoc
    Je pense que tu peux utiliser le swap aussi sur operator= (T*).
    En effet ça semble fonctionner, c'est modifé merci
    Et aussi, je te pose la question avant corrector: Constructeur implicite, c'est voulu ?
    En prévision a cette question qui m'a était posé 3fois j'ai laissé ce message :
    Citation Envoyé par babar63
    Je ne suis pas encore bien habitué au mot clé explicit mais dans mon projet j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SceneManager.AddCamera( new CCamera(*this) );
    Avec AddCamera prenant un smart pointer (de CCamera) en paramètre, dans ce cas il faut bien utiliser le constructeur en tant que conversion implicite non?
    Pourquoi cette question revient-elle? Il y a des risques (dans mon cas)?
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  15. #55
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    OK. En effet, là, le constructeur implicite est requis, je pense.

    Et pour les risques, je ne sais pas trop à part des risques de confusion. J'ai surtout posé la question par mimétisme, parce que corrector la posait...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #56
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    class CSmartPointer
    {
    public:
    	CSmartPointer(CSmartPointer<T> const &SmartPointer);
    Dans la classe elle-même, tu peux écrire CSmartPointer à la place de CSmartPointer<T>.
    Citation Envoyé par babar63 Voir le message
    Pourquoi faire un foncteur?
    Citation Envoyé par babar63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	T const * const operator -> () const;
    	T * const operator -> ();
    	T const & operator * () const;
    	T & operator * ();
     
    	operator T const * const() const;
    	operator T * const();
    Pourquoi la distinction const/non const?

    (Soit rigoureux dans ton explication.)
    Citation Envoyé par babar63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class T>
    inline CSmartPointer<T>::CSmartPointer(T *Pointer) : m_Pointer(Pointer), m_Counter(NULL)
    {
    	AllocateCounter();
    Pourquoi faire une fonction séparée? Tu ne l'appelles qu'une seule fois.
    Citation Envoyé par babar63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class T>
    inline CSmartPointer<T>::CSmartPointer(CSmartPointer<T> const &SmartPointer) : m_Pointer(SmartPointer.m_Pointer), m_Counter(SmartPointer.m_Counter)
    {
    	++(*m_Counter);
    Ces parenthèses sont redondantes.
    Citation Envoyé par babar63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class T>
    inline CSmartPointer<T>::~CSmartPointer()
    {
    	if( --(*m_Counter) == 0 )
    Ces parenthèses sont redondantes.
    Citation Envoyé par babar63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    inline T const & CSmartPointer<T>::operator * () const
    {
    	Assert( m_Pointer != NULL );
    	return (*m_Pointer);
    Ces parenthèses sont redondantes.
    Citation Envoyé par babar63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class T>
    inline void CSmartPointer<T>::AllocateCounter()
    {
    	SAFE_DELETE(m_Counter);
    Pourquoi SAFE_DELETE?

  17. #57
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pourquoi la distinction const/non const?
    En effet, ce n'est pas forcément approprié. Mais ça peut aussi l'être, dépendant des circonstances. Enfin, je crois. Mais en y réfléchissant plus, je ne vois plus trop où, les exemples que j'avaient en tête s'écroulent dès que j'y pense plus d'une seconde...

    Pour bien faire, il faudrait peut-être deux versions de la classe: Une qui fait des contrôles comme ça, une autre où la constance de l'objet est complètement dissociée de celle du pointeur intelligent...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #58
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En effet, ce n'est pas forcément approprié.
    En fait ça n'a aucun sens.

  19. #59
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par corrector
    Pourquoi faire un foncteur?
    D'après la FAQ c'est un prédicat si j'ai bien compris, je l'utilise simplement pour tester si mon objet pointé est valide(NULL) ou non.
    Citation Envoyé par corrector
    Pourquoi la distinction const/non const?
    N'est-il pas correct d'utiliser un maximum de const lorsqu'on le peut? Voila un exemple de mon projet qui utilise la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T const * const operator -> () const;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //fonction membre de CSeneManager :
    std::vector<ILightPtr> const &	GetLights() const
    {
    	return m_Scene->Lights;    // Un vecteur de ILightPtr membre de la class
    }
    Je suppose que je n'ai pas besoin de montrer d'exemple pour le même opérateur sans tous ces consts , ce n'est donc pas correct? pourquoi?
    Citation Envoyé par corrector
    Soit rigoureux dans ton explication
    Je fais de mon mieux mais je suis en train d'apprendre donc je ne peux pas toujours expliquer comme il le faudrait, sans doute je l'ai vu quelques part, ça m'a parut intelligent, j'ai gardé l'idée et je la ressort de temps en temps .
    Citation Envoyé par corrector
    Pourquoi faire une fonction séparée? Tu ne l'appelles qu'une seule fois
    Justement je l'appelais dans mon opérateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CSmartPointer<T> & operator = (T *Pointer);
    Que j'ai modifié à la suite de la remarque de médinoc, mais j'ai oublié de supprimer la fonction après...(je le fais de suite)
    Citation Envoyé par corrector
    Ces parenthèses sont redondantes
    Je préfère parfois mettre un peu plus de parenthèse, dans la limite du raisonnable je trouve le code plus clair... Est-ce un mauvais réflexe?
    Citation Envoyé par corrector
    Pourquoi SAFE_DELETE
    Euh........ Pour le coup j'avoue que je ne vois plus donc sans doute une mauvaise raison . En revanche le deuxième :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch(std::bad_alloc &) {
    		SAFE_DELETE(m_Pointer);
    		throw;
    	}
    est correct non? Je l'utilise pour supprimer m_Pointer si il est NULL et le réinitialiser à NULL
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  20. #60
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    N'est-il pas correct d'utiliser un maximum de const lorsqu'on le peut? Voila un exemple de mon projet qui utilise la fonction
    <snip>
    Je suppose que je n'ai pas besoin de montrer d'exemple pour le même opérateur sans tous ces consts , ce n'est donc pas correct? pourquoi?
    Le problème, c'est que ce code suppose que dès que le pointeur est constant, les données pointées le sont aussi.
    Si tu veux un smart pointer vers des données constantes, tu peux en faire un qui retourne toujours un T* et juste faire un CSmartPointer< const int > par exemple...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Flash Disque non fonctionnel
    Par stanley dans le forum Composants
    Réponses: 2
    Dernier message: 18/07/2006, 12h18
  2. Code non fonctionnel sous IE
    Par Nip dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/06/2006, 14h59
  3. timage non fonctionnel !!
    Par micky13 dans le forum Delphi
    Réponses: 5
    Dernier message: 13/05/2006, 07h21
  4. Update non fonctionnel
    Par kissmytoe dans le forum Access
    Réponses: 7
    Dernier message: 07/03/2006, 18h37
  5. [REPORTS] Order BY non fonctionnel
    Par sdiack dans le forum Reports
    Réponses: 2
    Dernier message: 10/02/2006, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo