当前位置: 首页 > news >正文

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的进阶用法,泛型接口的应用等,同时具有一定难度.在这种情况下,找一些较为容易的解决方案,在加深对语言的理解的同时为自己节约一些学习时间.

        设计模式中的"原型模式",也可以尝试用这种写法来替代.

=============================内容分割线=================================== 

小结

        深复制的一种替代方案


http://www.mrgr.cn/news/26444.html

相关文章:

  • Upstage 将发布新一代 LLM “Solar Pro “预览版
  • sharding-jdbc metadata load优化(4.1.1版本)
  • 工具方法 - 高我法
  • 在国内版Office 365中通过PowerShell命令查询指定主题的邮件详解
  • Java 每日一刊(第6期):整数运算
  • AI+RPA:开启智能自动化新时代
  • Flask中的蓝图如何进行模块化
  • Git 中的refs
  • CSS基本布局理解——WEB开发系列38
  • LLM - 理解 多模态大语言模型 (MLLM) 的指令微调与相关技术 (四)
  • Java微服务架构最佳实践:如何设计高可用的分布式系统
  • C++——unordered_map
  • SciPy 插值
  • C++ | Leetcode C++题解之第404题左叶子之和
  • 一次开发,多端部署--实例介绍
  • Java应用的数据库连接池连接池故障恢复
  • Java 行为型设计模式一口气讲完!*^____^*
  • django-admin自定义功能按钮样式
  • 大模型→世界模型下的「认知流形」本质·下
  • 【隐私保护】如何找出CLS方案的创新之处?