设计模式第三天|建造者模式 4. 自行车加工 原型模式 5. 矩形原型

目录

  • 【设计模式专题之建造者模式】4. 自行车加工
  • 【设计模式专题之原型模式】5. 矩形原型

【设计模式专题之建造者模式】4. 自行车加工

文章链接:卡码网设计模式
题目链接:4. 自行车加工

注意重载<<函数的写法和使用方式,使用时与其它重载符号区别于参数对象。
另外定义为 friend 该类的友元函数意味着其可以访问该类的私有成员,而不加friend 则operator<< 被定义为全局函数,而不是类的成员函数。这意味着这个函数不能直接访问类的私有成员,因为它不是类的成员函数。

#include <iostream>
#include <bits/stdc++.h>using namespace std;class Bike{
private:string frame;string tires;public:void setFrame(const string& frame){this->frame = frame;}void setTires(const string& tires){this->tires = tires;}friend ostream& operator<<(ostream& os, const Bike& bike){os << bike.frame << " " << bike.tires;return os;}
};class BikeBuilder{
public:virtual void buildFrame() = 0;virtual void buildTires() = 0;virtual Bike getResult() = 0;
};class MountainBikeBuilder : public BikeBuilder{
private:Bike bike;public:void buildFrame() override{bike.setFrame("Aluminum Frame");}void buildTires() override{bike.setTires("Knobby Tires");}Bike getResult() override{return bike;}
};class RoadBikeBuilder : public BikeBuilder{
private:Bike bike;public:void buildFrame() override{bike.setFrame("Carbon Frame");}void buildTires() override{bike.setTires("Slim Tires");}Bike getResult() override{return bike;}
};class BikeDirector{
public:Bike construct(BikeBuilder& builder){builder.buildFrame();builder.buildTires();return builder.getResult();}    
};int main(){int N;cin >> N;BikeDirector director;for (int i = 0; i < N; i++){BikeBuilder* builder = nullptr;string type;cin >> type;if (type == "mountain"){builder = new MountainBikeBuilder();}else if (type == "road"){builder = new RoadBikeBuilder();}Bike bike = director.construct(*builder);cout << bike << endl;delete builder;}return 0;
}

【设计模式专题之原型模式】5. 矩形原型

文章链接:卡码网设计模式
题目链接:5. 矩形原型

注意两点:

  1. 在未显示定义拷贝构造函数时,C++编译器会使用默认拷贝构造函数,且是浅拷贝;创建新对象时使用 = 叫做 复制初始化,会调用拷贝构造函数。

拷贝构造函数用于创建一个对象的副本,它在以下情况下被调用:

对象通过值传递给函数。
对象以值传递方式从一个函数返回。
通过另一个对象初始化一个新对象。
当对象作为另一个对象的元素被初始化时

浅拷贝指的是新对象复制了原对象成员变量的指针,与原对象共享动态分配的内存块;深拷贝指的是复制了原对象的所有成员,包括指向的动态分配的内存,每个成员都有自己的内存副本(新对象不改变成员变量的值时,新对象与原对象指向同一块内存,改动新对象成员变量值时, 新对象成员变量指针发生变动,指向自己的副本内存并对值进行改动,记得是这样)

  1. RectanglePrototype类中return 后使用的 + 是string类重载的 +。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;class Prototype{
public:virtual Prototype* clone() = 0;virtual string getDetails() = 0;
};class RectanglePrototype : public Prototype{
private:string color;int width;int height;
public:RectanglePrototype(string color, int width, int height): color(color), width(width), height(height) {}Prototype* clone() override{return new RectanglePrototype(*this); // 使用编译器默认拷贝构造函数}string getDetails() override{return "Color: " + color + ", Width: " + to_string(width) + ", Height: " + to_string(height); // string类重载的加号}
};int main(){vector<Prototype*> rectangles;int N;cin >> N;for (int i = 0; i < N; i++){string color;int width;int height;cin >> color >> width >> height;Prototype* originalPrototype = new RectanglePrototype(color, width, height);rectangles.push_back(originalPrototype);}for (const auto& rectangle : rectangles){Prototype* colneRectangle = rectangle->clone(); //复制初始化,编译器调用默认拷贝构造函数,浅拷贝cout << colneRectangle->getDetails() << endl;delete colneRectangle;}for (const auto& rectangle : rectangles){delete rectangle;}return 0;
}

设计模式第三天打卡,复习了很多C++面向对象的知识,对从前从视频上看到的知识理解更加深了哈哈哈,还是得自己动手敲代码学习理解的深啊,加油!!!

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

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

相关文章

从汇编层面理解C++ this指针

在c中&#xff0c;调用对象的非静态成员函数过程中&#xff0c;编译器会自动添加this指针作为第一个参数。我们从汇编层面看看this指针是如何传进来的。 使用如下简单的程序来演示&#xff1a; class A { private:int a[100];int b; public:void SetB(int b){ this->b b;…

设计模式通用解释及Java代码用例整理

文章目录 23种设计模式单例模式&#xff08;Singleton Pattern&#xff09;工厂模式&#xff08;Factory Pattern&#xff09;抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;建造者模式&#xff08;Builder Pattern&#xff09;原型模式&#xff08;Prototype …

Python与Go中详细的异常处理机制|面试题

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

django+flask+python高校教材管理系统47nia

本.4论文结构 绪论&#xff1a;剖析项目可行性&#xff0c;表明研究方向。 开发技术&#xff1a;系统关键运用了Python技术性、Django框架、B/S架构和myspl数据库查询&#xff0c;并进行了详细介绍[6]。 系统分析&#xff1a;包含系统的总体构造&#xff0c;用例图和结构图。 系…

故障诊断 | 一文解决,CNN-LSTM卷积神经网络-长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-LSTM卷积神经网络-长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-LSTM模型是一种结合了卷积神经网络(Convolutional Neural Network)和长短期记忆神经网络(Long Short-Term Memory)的组合模型,常用于数据故障…

SpringBoot使用Kafka详解含完整代码

1. 前言 随着大数据和实时处理需求的增长&#xff0c;Kafka作为一种分布式流处理平台&#xff0c;与Spring Boot的集成变得尤为重要。本文将详细探讨如何在Spring Boot应用程序中设置和使用Kafka&#xff0c;从基础概念到高级特性&#xff0c;通过实际代码示例帮助读者深入理解…

大语言模型的未来进化路径及其影响

随着人工智能技术的飞速发展&#xff0c;大语言模型已成为智能时代的重要标志之一。从早期基于规则和统计学习的语言模型&#xff0c;到如今基于深度学习框架下的Transformer架构&#xff0c;如GPT系列、BERT等&#xff0c;大语言模型已经在自然语言处理领域取得了前所未有的突…

uniapp中封装一个svg转base64的组件

uniapp中由于不支持svg--》base64&#xff0c;同时无法使用h5中atob&#xff0c;这里我们采用js-base64插件实现这样一个组件&#xff0c;只要传人svg的代码即可在uniapp中转为base64&#xff0c;同时支持自定义参数&#xff0c;比如宽度&#xff0c;高度,等 1 安装 npm inst…

《动手学深度学习(PyTorch版)》笔记6.3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

Python实现PDF到HTML的转换

PDF文件是共享和分发文档的常用选择&#xff0c;但提取和再利用PDF文件中的内容可能会非常麻烦。而利用Python将PDF文件转换为HTML是解决此问题的理想方案之一&#xff0c;这样做可以增强文档可访问性&#xff0c;使文档可搜索&#xff0c;同时增强文档在不同场景中的实用性。此…

【FPGA原型验证】附录基础知识:FPGA/CPLD基本结构与实现原理

聚焦Xilinx ISE 介绍Xilinx公司及其产品的基本情况,并在此基础上描述了CPLD和FPGA的内部结构及基本原理。 1.1 Xilinx公司及其产品介绍 总部设在加利福尼亚圣何塞市(San Jose)的Xilinx是全球领先的可编程逻辑解决方案的供应商,图1-1为公司标志。 Xilinx公司的业务是研发…

后端——go系统学习笔记(不断更新中......)

数组 固定大小 初始化 arr1 : [3]int{1, 2, 3} arr2 : [...]int{1, 2, 3} var arr3 []int var arr4 [4]int切片 长度是动态的 初始化 arr[0:3] slice : []int{1,2,3} slice : make([]int, 10)len和cap len是获取切片、数组、字符串的长度——元素的个数cap是获取切片的容量—…

Android PMS——ADB命令安装流程(七)

前面的文章我们介绍了系统应用解析流程和通过 PackageInstaller.apk安装应用程序的相关流程,这一篇我们来分析使用 ADB 命令来实现 APK 安装流程。 一、ADB安装命令 ADB命令使用 adb install [选项] [APK绝对路径] 常见选项如下: -r:覆盖安装,保存原有数据; -t:…

深度学习入门笔记(七)卷积神经网络CNN

我们先来总结一下人类识别物体的方法: 定位。这一步对于人眼来说是一个很自然的过程,因为当你去识别图标的时候,你就已经把你的目光放在了图标上。虽然这个行为不是很难,但是很重要。看线条。有没有文字,形状是方的圆的,还是长的短的等等。看细节。纹理、颜色、方向等。卷…

Java正则表达式之Pattern和Matcher

目录 前言一、Pattern和Matcher的简单使用二、Pattern详解2.1 Pattern 常用方法2.1.1 compile(String regex)2.1.2 matches(String regex, CharSequence input)2.1.3 split(CharSequence input)2.1.4 pattern()2.1.5 matcher(CharSequence input) 三、Matcher详解3.1 Matcher 常…

JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】

JSP和JSTL板块&#xff1a;第三节 JSP四大域对象 一、page范围二、request范围三、session范围四、application范围 在服务器和客户端之间、各个网页之间、哪怕同一个网页之内&#xff0c;总是需要传递各种参数值&#xff0c;这时JSP的内置对象就是传递这些参数的载具。内置对象…

Redis面试题38

人工智能在医疗领域有哪些应用&#xff1f; 答&#xff1a;人工智能在医疗领域有许多应用&#xff0c;下面是一些常见的例子&#xff1a; 图像识别和辅助诊断&#xff1a;人工智能可以用于图像识别和辅助诊断&#xff0c;例如在医学影像领域&#xff0c;人工智能可以辅助医生分…

​(四)hive的搭建2

在&#xff08;三&#xff09;hive的搭建1中我们搭建好了hive环境&#xff0c;但是只能本地访问&#xff0c;在本节中配置Hive的访问方式。 1.元数据服务的方式 1.1 编辑hive-site.xml sudo vi hive-site.xml 在文件最后增加以下内容 <!– 指定存储元数据要连接的地址 –…

WebGL 1.0 内置函数

前言 本篇文章介绍WebGL 1.0 shader中支持的内置函数 角度弧度转化 角度转弧度radians 计算公式&#xff1a; R π d e g r e e 180 R \pi \times degree \div 180 Rπdegree180 float radians(float degree) vec2 radians(vec2 degree) vec3 radians(vec3 degree)…

无里程计下的纯跟踪算法实现

文章目录 概要生成相机坐标系下的三维坐标无里程计下的纯跟踪算法实现 概要 当你只有一个相机的时候&#xff0c;想要快速实现机器人跟随功能&#xff0c;没有里程计的情况下&#xff0c;就可以看这里了。这篇博文实现了一个无里程计下的纯跟踪算法。 生成相机坐标系下的三维…