In order to prevent bad usage of a class T and shared_ptr (typically, constructing multiple shared_ptrs from the same T*, resulting in double free) I thought to force shared pointers to be used, by making the class constructor private, and adding a factory method to create a shared_ptr.
Question 1: is this a bad approach and why?
I abstracted all the above functionality into this base class template:
#include <memory>
template<typename T>
class add_make_shared : public std::enable_shared_from_this<T>
{
public:
typedef std::shared_ptr<T> Ptr;
template<typename... Args>
static Ptr make_shared(Args&&... args)
{
return Ptr(new T(std::forward<Args>(args)...));
}
};
I also inherit from enable_shared_from_this because it is useful in this scenario.
Then, one is required to do, for every class A:
class A : public add_make_shared<A>
{
private:
friend class add_make_shared<A>;
A(...) { ... }
public:
...
};
basically:
- declare add_make_shared as friend, because it needs to construct A
- declare A's constructor private
(Provided that you answered no to Question 1) Question 2: is this implementation optimal or how can be improved?
For my taste is still a bit verbose, due to the two above points.
Aucun commentaire:
Enregistrer un commentaire