Re: Rewriting clone() to return a boost::shared_ptr ?
helix wrote:
Hi,
Are there any issues relating to writing clone() so that it returns a
smart pointer (e.g. boost::shared_ptr) rather than a raw pointer? For
example, if I have a virtual base class, A, which exposes a clone
function, and a class, B, which is dervied from A, will my 'smart'
clone() do what I expect it to do ?
class A
{
A();
virtual ~A();
virtual boost::shared_ptr<A> clone() const = 0;
}
class B : public A
{
B();
virtual ~B();
virtual boost::shared_ptr<A> clone() const;
}
boost::shared_ptr<A> B::clone() const
{
return boost::shared_ptr<A>(new B(*this));
}
I recommend against using clone functions altogether, and instead use a
smart pointer that can handle cloning without requiring the target type
to have a clone function.
Consider using the following smart pointer which can do just that:
http://axter.com/smartptr
The clone function method requires more maintenance, and it's more
prone to bugs.
Consider what happens when a derived derived type gets added that
doesn't implement its own clone function.
When this happens, the object gets spliced.
For a more simplified version of the above smart pointer, check out the
copy_ptr:
http://axter.com/smartptr/copy__ptr_8hpp-source.htm
http://code.axter.com/copy_ptr.h
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]