shallow copy and deep copy in Prototype Pattern

深复制和浅复制的实现,最重要的在于拷贝构造函数,针对的是有指针成员变量的类

深复制, 在拷贝构造函数中会运用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  
}
*/

小结

注明:假如是老师与学生的一些内容的存储,也可以用这样的形式来实现,这一方法对于大数量的数据非常有用,而且在生活中的具体应用有很多,比如说公司员工的情况,不仅仅是简历的情况,还包括员工的个人资料,员工的工作情况等等.都可以通过这种方式来实现.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值