C ++:复制派生元素的树

时间:2015-10-28 16:50:12

标签: c++ inheritance recursion deep-copy

我有一个基类和几个派生类。基类如下所示:

class Base
{
    int type; //the derived type the object belongs to
    int nOfChildren;
    Base** children; //each child can be any of the derived types
    ...
}

现在我需要复制Base的实例。由于递归,需要虚拟方法Base::duplicate()。它似乎也应该清楚:

Base temp = new Base();
temp->type = temp;
temp->nOfChildren = nOfChildren;
temp->children = new Base*[nOfChildren];
除此之外,还不是那么清楚。

我是否将每个temp->children[i]分配为Base个对象或派生对象?我是否需要一个案例陈述来满足所有可能的派生类型?我是否需要为每个派生类型实现duplicate()方法,即使那些不包含除Base类之外的其他信息的方法? (如果派生类包含更多信息,那么很明显我需要一个单独的机制。虽然它们包含未显示的handler()方法的不同实现,但有几个派生类不包含除基础之外的其他数据。 )

1 个答案:

答案 0 :(得分:4)

你是对的,克隆多态对象需要一个虚方法。 OTOH,您可以利用C ++功能来简化编写:

class Child : public ICloneable {
public:
    // stuff...
    Child *clone() const { return new Child(*this); }
}

另外,不要将对象集合放入数组中!请改用std::vector

class Base
{
    // stuff...
    std::vector<Base*> children;
}

更好的是,使用智能指针将克隆操作包装到对象中std::vector将能够透明地进行管理。

template<typename T>
struct clone_ptr {
    T *object;

    clone_ptr() : object(new T()) {}
    clone_ptr(T *object_) : object(object_) {}
    clone_ptr(clone_ptr<T> const &other) : object(other.object->clone()) {}
    clone_ptr<T> &operator=(clone_ptr<T> other) {
        std::swap(object, other.object);
        return *this;
    }

    ~clone_ptr() { delete object; }
};

通过这种方式,您可以在基地使用std::vector clone_ptrs

class Base
{
    // stuff...
    std::vector<clone_ptr<Base>> children;
}

每个对象都将自动复制到具有相同多态类型的对象中,只要在每个类中实现clone()即可。该向量将以与其他数据成员相同的方式克隆,由C ++编译器自动克隆。