深复制和浅复制的实现,最重要的在于拷贝构造函数,针对的是有指针成员变量的类
深复制, 在拷贝构造函数中会运用new创建新的指针,并将原有的值赋值给新创建的指针
浅赋值,直接进行指针的值赋值,不要这样使用,会导致同一指针的多次delete
下面是一个例子(注明:这个例子是从其他的博客上学习的)
首先是抽象类提供了一个接口,关于clone的函数声明
然后是workexperience单独作为一个类的实现
workexperience以指针的形式作为resume(职业简历)的一个数据成员
resume类继承了抽象类ICloneable;
// deep copy in prototype pattern
#include<iostream>
#include<string>
#include<memory>
using namespace std;
template<class T>
class ICloneable {
public:
virtual T* clone() = 0;
};
class CWorkExperience {
private:
string m_strCompany;
string m_strWorkTime;
public:
CWorkExperience() {}
CWorkExperience(const string& company, const string& workTime) {
m_strCompany = company;
m_strWorkTime = workTime;
}
CWorkExperience(const CWorkExperience& right) {
m_strCompany = right.m_strCompany;
m_strWorkTime = right.m_strWorkTime;
}
~CWorkExperience() {
cout << "CWorkExperience析构" << endl;
printInfo();
}
void setCompany(const string& company) {
m_strCompany = company;
}
const string& getCompany() const {
return m_strCompany;
}
void setWorkTime(const string& workTime) {
m_strWorkTime = workTime;
}
const string& getWorkTime() const {
return m_strWorkTime;
}
void printInfo() {
cout << "Company: " << m_strCompany << endl;
cout << "workTime: " << m_strWorkTime << endl;
}
};
class CResume:public ICloneable<CResume> {
protected:
string m_name;
string m_sex;
int m_age;
CWorkExperience m_experience;
public:
CResume() {}
~CResume() {
cout << "CResume析构" << m_name << endl;
}
void setInfo(const string& name, const string& sex, int age) {
m_name = name;
m_sex = sex;
m_age = age;
}
void setExperience(const string& company, const string& workTime) {
m_experience.setCompany(company);
m_experience.setWorkTime(workTime);
}
CResume* clone() {
CResume* resume = new CResume;
resume->setInfo(m_name, m_sex, m_age);
resume->setExperience(m_experience.getCompany(), m_experience.getWorkTime());
return resume;
}
void printInfo() {
cout << "Name: " << m_name << endl;
cout << "Sex: " << m_sex << endl;
cout << "Age: " << m_age << endl;
cout << "Experience: " << endl;
m_experience.printInfo();
}
};
void testPrototype() {
CResume re;
re.setInfo("Jacky", "Male", 20);
re.setExperience("MS", "2001.11-2005.11");
re.printInfo();
CResume* pClone = re.clone();
pClone->setInfo("Marry", "Female", 30);
pClone->setExperience("Google", "2006.01-2010.01");
pClone->printInfo();
delete pClone;
pClone = NULL;
}
int main(void) {
testPrototype();
return 0;
}
// 下面部分是浅复制,只修改了三个函数,重点是拷贝构造函数
/*
CResume(const CWorkExperience& right) {
m_experience = right.m_experience;
}
CResume(const CResume& right) {
m_name = right.m_name;
m_sex = right.m_sex;
m_age = right.m_age;
m_experience = right.m_experience; // important
}
CResume* Clone() {
CResume* re = new CResume(*this); // shadow copy
}
*/
小结
注明:假如是老师与学生的一些内容的存储,也可以用这样的形式来实现,这一方法对于大数量的数据非常有用,而且在生活中的具体应用有很多,比如说公司员工的情况,不仅仅是简历的情况,还包括员工的个人资料,员工的工作情况等等.都可以通过这种方式来实现.