I am learning prototype design pattern and implementing a demo,I add deep copy constructors and clone functions to these classes,but I'm not sure if I implemented them correctly. I did the dynamic_cast conversion in otherNode, It‘s a little weird. Any suggestions?
class base {
public:
explicit base() {}
virtual ~base() = default;
virtual base* clone() const = 0;
};
class ttNode : public base {
public:
explicit ttNode() : base() {}
~ttNode() = default;
};
class SonNode : public ttNode {
public:
SonNode() : ttNode() {}
~SonNode() = default;
base* clone() const override {
return new SonNode(*this);
}
private:
int c_{0};
int a_{0};
};
class FatherNode : public ttNode {
public:
FatherNode() : ttNode() {}
~FatherNode() = default;
FatherNode(const FatherNode& node) : ttNode(node) {
for (const auto &son : node.sons_) {
sons_.emplace_back(new SonNode(*son));
}
}
base* clone() const override {
return new FatherNode(*this);
}
private:
std::vector<SonNode*> sons_;
};
class otherNode : public base {
public:
otherNode() : base() {}
~otherNode() = default;
base* clone() const override { return new otherNode(*this); }
otherNode(const otherNode& node) : base(node) {
ttt = dynamic_cast<ttNode*>(node.ttt->clone());
}
private:
ttNode* ttt;
};
TEST_F(tt, base1) {
base *o = new otherNode();
base *f = new FatherNode();
base *o1 = o->clone();
base *f1 = f->clone();
delete o1;
delete f1;
}
I can't use ttt = new ttNode(*node.ttt);
because ttNode is abstract class.