C++clone()函数的⽤法
转⾃:blog.csdn/xiangxianghehe/article/details/78793300
原型模式
在C++中,要拷贝⼀个对象,除了⾃定义⼀个拷贝构造函数来实现对象复制外,还可以实现⼀个clone函数。这需要借助编译器实现的⼀个隐藏拷贝构造函数,这样的做法,更省⼼。
背后的原理是C++的原型(Prototype)模式:⽤原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype模式提供了⼀个通过已存在对象进⾏新对象创建的接⼝(Clone), Clone()实现和具体的语⾔相关,在C++中通过拷贝构造函数实现。
注意:clone函数是virtual的,⽆法内联。
⽰例代码:
#include "stdafx.h"
#include <iostream>
class CA
{
public:
int value;
CA* clone() const { return new CA( *this );}
//仅⼀个构造函数
CA(int a ){value=a;}
};
int _tmain(int argc, _TCHAR* argv[])
{
CA* objA=new CA(10);
CA* objtemp=objA->clone();
delete objA;
std::cout<<objtemp->value;
delete objtemp;
return 0;
}
Prototype 模式的应⽤场景在于,你拿到⼀个 Base* ,它指向某个 Derived 对象,你想克隆出 Derived 对象,但代码中不写出 Derived 的具体类型,因为有很多派⽣类,这种情况下你⽤构造函数是搞不定的,就需要Prototype 模式了。
clone
原型模式的作⽤
1、基本就是你需要从A的实例得到⼀份与A内容相同,但是⼜互不⼲扰的实例的话,就需要使⽤原型
模式。
2、⽤原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这个其实和C++的拷贝构造函数的作⽤是相似的(但不相同),实际上就是动态抽取当前对象运⾏时的状态。
原型模式的优势
⼀.为什么不⽤new直接新建对象,⽽要⽤原型模式?
⾸先,⽤new新建对象不能获取当前对象运⾏时的状态,其次就算new了新对象,在将当前对象的值复制给新对象,效率也不如原型模式⾼。
⼆.为什么不直接使⽤拷贝构造函数,⽽要使⽤原型模式?
原型模式与拷贝构造函数是不同的概念,拷贝构造函数涉及的类是已知的,原型模式涉及的类可以是未知的。
原型模式⽣成的新对象可能是⼀个派⽣类。拷贝构造函数⽣成的新对象只能是类本⾝。原型模式是描述了⼀个通⽤⽅法(或概念),它不管是如何实现的,⽽拷贝构造则是描述了⼀个具体实现⽅法。
class base
{
public :
base();
base(base &obj);
virtual  ~base();
virtual base *clone() { return new base(*this) ; };
};
class derived : public base
{
public :
derived();
derived(  derived &);
virtual base *clone(){return new derived (*this); }
....
};
base *obj1 = new base ;
base *obj2 = new derived ;//基类指针指向派⽣类对象,怎样⽤基类指针创建⼀个新的派⽣类对象??⽤基类的拷贝构造函数显然不⾏。
base *obj3 = obj1 .clone();
base *obj4 = obj12.clone();
适⽤场景
1.资源优化场景
类初始化需要消化⾮常多的资源,这个资源包括数据、硬件资源等。
2.性能和安全要求的场景
通过new产⽣⼀个对象需要⾮常繁琐的数据准备或访问权限,则可以使⽤原型模式。
3.⼀个对象多个修改者的场景
⼀个对象需要提供给其他对象访问,⽽且各个调⽤者可能都需要修改其值时,可以考虑使⽤原型模式拷贝多个对象供调⽤者使⽤。
缺点
1、配备克隆⽅法需要对类的功能进⾏通盘考虑,这对于全新的类不是很难,但对于已有的类不⼀定很容易,特别当⼀个类引⽤不⽀持串⾏化的间接对象,或者引⽤含有循环结构的时候。
2、实现原型模式每个派⽣类都必须实现 Clone接⼝。
3、逃避构造函数的约束。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。