On Dec 1, 5:08 pm, Ulrich Eckhardt <dooms...@knuut.de> wrote:
Give them this sample code and ask them to improve it using std::auto_ptr.
Actually, there are lots of ways this code can be improved, and some will
be easy when touching the code anyway.
Solutions in the next days, unless anyone else wants to jump in. ;)
My version:
struct base
{
virtual ~base() {}
//two clone functions, made safe
template<class T> std::auto_ptr<T>clone()const{
//dynamic_cast to handle virtual base class case
//usually optimized away
return std::auto_ptr<T>(dynamic_cast<T*>(clone_imp()));
}
std::auto_ptr<base>clone()const{
return std::auto_ptr<base>(clone_imp());
}
private:
//not safe to call stand-alone, not in public interface
virtual base* clone_imp() const = 0;};
struct derived1: virtual base
{
private:
base* clone_imp() const
{ return new derived1(*this); }};
struct derived2: base
{
private:
base* clone_imp() const
{ return new derived2(*this); }
};
void foo(){
derived2 d2;
d2.clone();//return value still deleted
derived1 d1;
//std::auto_ptr<derived1> cd2(d1.clone());//does not compile
std::auto_ptr<derived1> cd1=d1.clone<derived1>();
//std::auto_ptr<derived2> cd2(d2.clone<derived1>());//BOOM
std::auto_ptr<derived1> cd2(d2.clone<derived1>());
assert(cd2.get()==0);
}
Lance
[ comp.lang.c++.moderated. First time posters: Do this! ]