假设我有这两个类:
class num{
public:
int a;
num(){};
num(int x):a(x){};
num(const num& n):a(n.a){}
virtual bool operator==(const num& n)const = 0;
virtual ~num(){};
};
class tmp: public num{
public:
tmp(){};
tmp(int x):num(x){};
tmp(const num& n): num(n){}
tmp(const tmp& t): num(t.a){}
virtual bool operator==(const num& n)const{
return tmp(n).a == a;
}
virtual ~tmp(){};
};
在main中有类似的东西:
int main() {
num* x = &get(...);
return 0;
}
get
返回tmp
类型的引用(在这种情况下。通常它会返回对继承自num
的类型的引用)
我想要做的是创建另一个num* y
,指向*x
的副本,这样如果我更改*y
,我就不会更改{{1} }}。我无法弄清楚如何做到这一点,因为*x
是抽象的,所以我无法创建这种类型的对象来制作副本。
好的,另一个问题。
如果我重载num
运算符:
<<
然后尝试这样做:
std::ostream& operator<<(std::ostream& os, const tmp& t){
return os<<t.a<<endl;
}
我收到错误cout<<*x<<endl;
这是为什么?
答案 0 :(得分:1)
您正在寻找prototype pattern,通常也称为克隆模式。
它基本上是一个纯虚方法
virtual std::unique_ptr<num> clone() const = 0;
...在num
中声明,被每个派生类覆盖。然后,您只需调用x->clone();
即可获得正确类型的全新对象。
答案 1 :(得分:1)
您需要一个虚拟函数来根据其动态类型克隆对象。它必须返回一个(最好是智能的)指针,指向一个新分配的正确类型的对象。例如:
class num {
public:
virtual std::unique_ptr<num> clone() const = 0;
// other members...
};
class my_num : public num {
public:
virtual std::unique_ptr<num> clone() const {
return std::make_unique<my_num>(*this);
}
// other members...
};
int main() {
num* x = &get(...);
auto y = x->clone();
}