原型模式(大话设计模式)C/C++版本

原型模式

C++

参考:https://www.cnblogs.com/Galesaur-wcy/p/15924300.html

#include <iostream>
#include <string>
using namespace std;class WorkExprerience
{
private:string workDate;string company;public:WorkExprerience() {}~WorkExprerience() {}WorkExprerience(WorkExprerience *work){this->workDate = work->workDate;this->company = work->company;}string getWorkDate(){return workDate;}void setWorkDate(string workDate){this->workDate = workDate;}string getCompany(){return company;}void setCompany(string company){this->company = company;}WorkExprerience *Clone(){return new WorkExprerience(this);}
};class Prototype
{
protected:string name;string sex;string age;string timeArea;string company;public:virtual void SetPersonalInfo(string sex, string age) = 0;virtual void Display() = 0;virtual Prototype &Clone() = 0;
};class Resume : public Prototype
{
private:WorkExprerience *workExp;public:Resume(string name){this->name = name;workExp = new WorkExprerience();}~Resume(){if (workExp != NULL)delete workExp;}void SetPersonalInfo(string sex, string age){this->sex = sex;this->age = age;}void SetWorkExperience(string workDate, string company){workExp->setCompany(company);workExp->setWorkDate(workDate);}void Display(){cout << name << "  " << age << " " << sex << "  " << endl;cout << "工作经历  " << workExp->getWorkDate() << "  " << workExp->getCompany() << endl;}Resume &Clone(){Resume *clonedResume = new Resume(name);clonedResume->SetPersonalInfo(sex, age);return *clonedResume;}
};int main()
{Resume *a = new Resume("big bird");a->SetPersonalInfo("MAN", "22");a->SetWorkExperience("1998-2000", "baidu");Resume b = a->Clone();b.SetWorkExperience("2000-2008", "google");Resume c = a->Clone();c.SetWorkExperience("2010-2018", "apple");a->Display();b.Display();c.Display();return 0;
}

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct
{char workDate[50];char company[50];
} WorkExperience;typedef struct
{char name[50];char sex[10];char age[10];char timeArea[50];char company[50];
} PersonalInfo;typedef struct Resume Resume;
struct Resume
{PersonalInfo info;WorkExperience *workExp;void (*display)(Resume *);Resume *(*clone)(Resume *);
};void DisplayResume(Resume *resume);
Resume *CloneResume(Resume *original);void InitWorkExperience(WorkExperience *exp)
{strcpy(exp->workDate, "");strcpy(exp->company, "");
}void SetWorkExperience(WorkExperience *exp, const char *date, const char *company)
{strcpy(exp->workDate, date);strcpy(exp->company, company);
}void DisplayWorkExperience(const WorkExperience *exp)
{printf("工作经历  %s  %s\n", exp->workDate, exp->company);
}Resume *CreateResume(const char *name)
{Resume *resume = (Resume *)malloc(sizeof(Resume));strcpy(resume->info.name, name);strcpy(resume->info.sex, "");strcpy(resume->info.age, "");strcpy(resume->info.timeArea, "");strcpy(resume->info.company, "");resume->workExp = (WorkExperience *)malloc(sizeof(WorkExperience));InitWorkExperience(resume->workExp);resume->display = DisplayResume;resume->clone = CloneResume;return resume;
}void DestroyResume(Resume *resume)
{if (resume){if (resume->workExp)free(resume->workExp);free(resume);}
}void SetPersonalInfo(Resume *resume, const char *sex, const char *age)
{strcpy(resume->info.sex, sex);strcpy(resume->info.age, age);
}void SetWorkExperienceForResume(Resume *resume, const char *date, const char *company)
{SetWorkExperience(resume->workExp, date, company);
}void DisplayResume(Resume *resume)
{printf("%s  %s %s  \n", resume->info.name, resume->info.age, resume->info.sex);DisplayWorkExperience(resume->workExp);
}Resume *CloneResume(Resume *original)
{Resume *cloned = CreateResume(original->info.name);strcpy(cloned->info.sex, original->info.sex);strcpy(cloned->info.age, original->info.age);SetWorkExperienceForResume(cloned, original->workExp->workDate, original->workExp->company);return cloned;
}int main()
{Resume *a = CreateResume("big bird");SetPersonalInfo(a, "MAN", "22");SetWorkExperienceForResume(a, "1998-2000", "baidu");Resume *b = a->clone(a);SetWorkExperienceForResume(b, "2000-2008", "google");Resume *c = a->clone(a);SetWorkExperienceForResume(c, "2010-2018", "apple");a->display(a);b->display(b);c->display(c);DestroyResume(a);DestroyResume(b);DestroyResume(c);return 0;
}

总结

在这里插入图片描述
关键在于实现一个Clone函数!!!
与拷贝构造函数相比就是:方便扩展,动态灵活定义拷贝行为(而且可被继承)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14.基于人类反馈的强化学习(RLHF)技术详解

基于人类反馈的强化学习&#xff08;RLHF&#xff09;技术详解 RLHF 技术拆解 RLHF 是一项涉及多个模型和不同训练阶段的复杂概念&#xff0c;我们按三个步骤分解&#xff1a; 预训练一个语言模型 (LM) &#xff1b;训练一个奖励模型 (Reward Model&#xff0c;RM) &#xf…

主题切换之CSS文件篇

动态加载CSS: 利用HTML的标签&#xff0c;可以通过JavaScript动态改变其href属性来加载不同的CSS文件。这意味着我们可以在运行时切换整个页面的样式表&#xff0c;从而实现主题的变化。 分离样式: 将不同主题的样式分别放在不同的CSS文件中。例如&#xff0c;default_styles.…

React小记——如何理解 props 单向数据流?

通俗来讲&#xff0c;就是 props 传递的数据只能由父组件流向子组件&#xff0c;子组件对接收到的 props 数据不可以直接修改 &#xff01; 但是可以由父组件传递 状态 的同时传递 修改状态的方法&#xff0c;然后由子组件调用该方法&#xff0c;达到修改 props 的目的&#xf…

Non-zero exit code pycharm

目录 windows 设置conda代理&#xff1a; linux Conda 使用代理 4. 修改 Conda SSL 验证 pycharm 报错 exceted command pip 设置代理 Non-zero exit code 科学上网后&#xff0c;pip安装时警告报错 WARNING: Retrying (Retry(total0, connectNone, readNone, redirectNo…

Spark 面试题(九)

1. 简述Spark的DAG以及它的生成过程 &#xff1f; 在Spark中&#xff0c;DAG&#xff08;有向无环图&#xff09;是描述作业中所有RDD转换操作依赖关系的图。DAG的生成过程是Spark作业调度的关键步骤之一。以下是对Spark DAG的简述以及它的生成过程&#xff1a; DAG的概念 节…

RabbitMQ实践——利用一致性Hash交换器做带权重的调度

在《RabbitMQ实践——利用一致性Hash交换器做负载均衡》一文中&#xff0c;我们介绍了如何开启一致性hash交换器&#xff0c;并实现了消息的负载均衡&#xff0c;以达到横向扩展消费者数量的能力。 但是现实中&#xff0c;可能存在这样的场景&#xff1a;一些队列所在的机器配置…

编程入门教育游戏教案:打造互动式学习体验

编程入门教育游戏教案&#xff1a;打造互动式学习体验 在当今数字化时代&#xff0c;编程技能已成为一项重要的素养。为了帮助初学者轻松入门编程&#xff0c;本文设计了一款编程入门教育游戏教案&#xff0c;旨在通过互动式学习体验&#xff0c;提升学生的编程兴趣和技能水平…

交易文本数据:情感分析 -另类数据交易- 舆情数据

交易文本数据:情感分析 这是三章中的第一章,专门介绍使用自然语言处理(NLP)和机器学习从文本数据中提取交易策略信号。 文本数据内容丰富但高度非结构化,因此需要更多预处理才能使ML算法提取相关信息。一个关键挑战是在不丢失其含义的情况下将文本转换为数值格式。我们将介绍…

第J7周:对于ResNeXt-50算法的思考

本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f680; 文章来源&#xff1a;K同学的学习圈子深度学习第J6周&#xff1a;ResNeXt-50实战解析K同学的学习圈子 在 ResNeXt 网络中&#xff0c;如果…

LeRobot——Hugging Face打造的机器人领域的Transformer架构

前言 如友人邓博士所说&#xff0c;“用 Stanford aloha 课题组提供的训练数据&#xff0c;训练他们研发的 Action Chunking Transformer 动作规划模型&#xff0c;训练结果&#xff0c;能用&#xff0c;但是稳定性有待提高 要提高稳定性&#xff0c;看来必须修改 Stanford a…

STM32学习笔记(三)--EXTI外部中断详解

&#xff08;1&#xff09;配置步骤1.配置RCC 打开外设时钟2.配置GPIO 选择端口输入模式3.配置AFIO 选择要用的一路GPIO 连接至EXTI 4.配置EXTI 选择边沿触发方式 上升沿 下降沿 双边沿 选择触发响应方式 中断响应 事件响应 5.配置NVIC 选择一个合适的优先…

喜讯:NetMarvel 深度合作伙伴「点金石」斩获2024·MAMA 营销增长奖

全球市场瞬息万变&#xff0c;如何让增长做到有迹可循&#xff1f; 5月20日&#xff0c;由 AppsFlyer 举办的「2024 MAMA 移动互联网高层峰会」在三亚拉开序幕。在本届颁奖典礼上&#xff0c;NetMarvel 深度合作伙伴——点金石&#xff08;GameGoing&#xff09; 荣获「营销增长…

java技术专家面试指南80问【java学习+面试宝典】(七)

Dubbo需要 Web 容器吗&#xff1f; 不需要&#xff0c;如果硬要用 Web 容器&#xff0c;只会增加复杂性&#xff0c;也浪费资源。 PrintStream、BufferedWriter、PrintWriter的比较? PrintStream类的输出功能非常强大&#xff0c;通常如果需要输出文本内容&#xff0c;都应…

PyQt5学习系列之新项目创建并使用widget

PyQt5学习系列之新项目创建并使用widget 前言报错新建项目程序完整程序总结 前言 新建项目&#xff0c;再使用ui转py&#xff0c;无论怎么样都打不开py文件&#xff0c;直接报错。 报错 Connected to pydev debugger (build 233.11799.298)新建项目程序 # Press ShiftF10 to…

【计算机视觉】人脸算法之图像处理基础知识(一)

图像处理基础知识&#xff08;一&#xff09; 1.图像的构成 图像的构成可以包括以下几方面知识&#xff1a; 1.像素&#xff1a;图像的基本单位&#xff0c;是图像中的一个点。每个像素都有特定的位置和色彩值。在数字图像中&#xff0c;像素的颜色通常由红、绿、蓝&#xf…

本地密码记录工具-KeePass

文章目录 软件界面软件下载KeePass配置KeePass修改中文创建数据库配置数据库锁定配置账户密码为不同应用配置账号密码插件安装及使用 数据库同步 在此之前&#xff0c;没有使用过类似的账户密码记录工具&#xff0c;甚至完全没有接触过&#xff0c;由于Edge浏览器自带保存密码并…

el-date-picker 有效时间精确到时分秒 且给有效时间添加标记

el-date-picker实现有效日期做标记且时分秒限制选择范围 代码如下&#xff1a; // html部分 <el-date-pickerv-model"dateTime"type"datetime":picker-options"pickerOptions" > </el-date-picker>// js部分 /*** 回放有效日期开始时…

通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器。通过对比三个算法可知&#xff0c;采用滑模控制算法&#xff0c;其具有最快的收敛性能&#xff0c;较强的鲁棒性&…

spring 对于 XML 中自定义标签的解析

我们知道&#xff0c;在 spring 的配置文件解析时&#xff0c;通过 XmlBeanDefinitionReader 来操作&#xff0c;下面来看看对 XML 配置文件解析时&#xff0c;这个类具体是如何操作的。 入口 protected int doLoadBeanDefinitions(InputSource inputSource, Resource resour…

链路追踪-微服务小白入门(6)

背景 什么是链路追踪 随着微服务分布式系统变得日趋复杂&#xff0c;越来越多的组件开始走向分布式化&#xff0c;如分布式服务、分布式数据库、分布式缓存等&#xff0c;使得后台服务构成了一种复杂的分布式网络。在服务能力提升的同时&#xff0c;复杂的网络结构也使问题定…