Я работаю над фреймворком C ++ и хотел бы применить автоматическое управление памятью для ряда базовых классов. До сих пор у меня есть стандартный подход, который
class Foo
{
public:
static
shared_ptr<Foo> init()
{
return shared_ptr<Foo>(new Foo);
}
~Foo()
{
}
protected:
Foo()
{
}
};
// Example of use
shared_ptr<Foo> f = Foo::init();
Однако вышеприведенное прерывается, когда я подкласс Foo, поскольку даже если init()
наследуется, он все равно возвращает shared_ptr<Foo>
, который содержит указатель на экземпляр Foo
.
Кто-нибудь может придумать элегантное решение для этого? Должен ли я, возможно, просто придерживаться (полу) ручной упаковки экземпляров класса с shared_ptr
? Это также дало бы возможность выставлять параметризованные конструкторы без объявления новых именованных конструкторов ...
Т.е.
template <typename T>
shared_ptr<T> make_shared(T* ptr)
{
return shared_ptr<T>(ptr)
}
// Example
shared_ptr<T>
f1 = make_shared(new Foo()),
f2 = make_shared(new Foo(1,2));