C++语法应用:深复制的一种替代方案
前言
编程是极其注重实践的工作,学习的同时要伴随代码
引入
此前写过一篇和深复制有关的帖子:C++基础语法:复制构造函数,赋值构造函数及浅复制,深复制_类的copy构造函数和赋值函数-CSDN博客 帖子最后提到了深复制的替代方案,但没有具体实施.在此应用
C++在使用深复制的时候,有个"约定",只要是属性里有指针,必然要深复制,并且重写析构函数,在里面定义delete.这样做是很好的,程序员先不要想把代码写得花里胡哨,尽量采用大家约好的写法使别人容易理解,保证代码正确性.
深复制回顾
深复制的本意是:当属性里有指针时,把指针指向的数据完全复制到当前对象中.然后无论怎样去复制当前对象,都不会出错.
深复制有个问题: 被复制的数据里有指针怎么办?
class Tmp{int* ar;int age;
public:Tmp(int* a,int ag):ar(a),age(ag){}; //构造函数
}class demo{Tmp* tmp;
public:demo(const demo& d){ //复制构造函数tmp=new Tmp;tmp->age=d.tmp->age;tmp->ar=d.tmp->ar; //指针复制?数据呢?};
}
当然你可以就这样做,对被复制对象中的指针浅复制,但似乎觉得和深复制的原意相背离
解决方案(非完全)
由基类引用可以指向派生类对象这个特点,提一种解决方案(非完全),但可解决大部分问题.
#include<iostream>
using namespace std;class Base { //基类string name;
public:Base(const string& na) :name(na) {}; //基类构造函数virtual void fun() { cout << "这是基类" << endl; };
};class Baseplus : public Base { //派生类 int age;
public:Baseplus(const string& na, int ag) :Base(na), age(ag) {}; //派生类构造函数void fun() { cout << "这是派生类" << endl; }};class Demo { //要拷贝的类Base& base;
public:Demo(Base& ba) :base(ba) {}; //要复制的对象类构造函数void fun() {base.fun();}
};
说明:
优点:
1.不传指针传基类引用.用几个默认函数即可,不需要重新定义析构函数,复制构造函数,赋值构造函数.
2.扩展方便,在派生类及其序列中添加新内容,其他不变.
缺点:
3.不能解决静态变量问题,如果有需要,单独在复制构造函数中添加解决的代码
4.需要手动delete不需要的对象,如果可以,使用智能指针.
测试代码
int main() {Base* ba = new Baseplus("zs", 20); //生成派生类对象Demo de(*ba);de.fun();cout << "==================分割线================" << endl;Base* ba2 = new Base("zs"); //生成基类对象Demo de2(*ba2);de2.fun();cout << "==================分割线================" << endl;Demo de3(de2); //复制对象de3.fun();
}
==============================内容分割线===================================
C++内容多,而且有不少在<C++ Prime Plus> 这本经典书中没有提及,比如RTTI的进阶用法,泛型接口的应用等,同时具有一定难度.在这种情况下,找一些较为容易的解决方案,在加深对语言的理解的同时为自己节约一些学习时间.
设计模式中的"原型模式",也可以尝试用这种写法来替代.
=============================内容分割线===================================
小结
深复制的一种替代方案