Suite à vos remarques, j'ai transformé mon code à plusieurs endroits.
J'ai supprimé ma classe make_ptr au profit de deux fonctions statiques, c'est nettement plus propre

:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
// Dans la classe:
static smart_ptr<T> make_ptr();
static smart_ptr<T> make_ptr(const T& t);
// Hors de la classe:
template <class T> inline smart_ptr<T> smart_ptr<T>::make_ptr()
{
return smart_ptr<T>(new T);
}
template <class T> inline smart_ptr<T> smart_ptr<T>::make_ptr(const T& t)
{
return smart_ptr<T>(new T(t));
} |
J'ai corrigé l'assignation:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
template <class T> inline const smart_ptr<T>& smart_ptr<T>::operator = (const smart_ptr<T>& ptr)
{
if(p_ != ptr.p_)
{
--(*count_);
if(*count_ == 0)
{
delete p_;
delete count_;
}
p_ = ptr.p_;
count_ = ptr.count_;
++(*count_);
}
return *this;
} |
Et j'ai renforcé la possibilité de gérer les exceptions:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
template <class T> inline smart_ptr<T>::smart_ptr(T* ptr_t) : p_(ptr_t)
{
try
{
count_ = new unsigned long int(1);
}
catch(...)
{
delete p_;
throw;
}
} |
Je suis donc à l'écoute de vos autres remarques si vous en avez

NB: Je ne me suis pas encore questionné sur les const comme ça a été suggéré.
Partager