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

面向对象示例——Basekt类

目标

定义一个能存放继承关系的容器Baseket类

难点

容器中不能保存不同类型的元素,那么该如何将具有继承关系的多种类型的对象存放在容器中呢?比如Bulk_quote和Quote,因为我们不能将Quote转换为Bulk_quote,所以容器肯定不能存放Bulk_quote类型。那保存Quote类型吗?也不行,虽然保存Quote类型可以让Bulk_quote放置进该容器,但是会丢失派生类自己的部分。

vector<Quote> basket;
basket.push_back(Quote("0-201-82470-1", 50));
basket.push_back(Bulk_quote("0-201-54848-8", 50, 10, 0.25));
//正确的,但是只把对象的Quote部分拷贝给了basket
cout << basket.back().net_price(15) << endl;
//这里调用的是Quote版本的net_price

实际上当我们希望在容器中存放具有继承关系的对象时,我们存放的通常是基类的指针(智能指针更好)。这些指针所指对象的动态类型可能是基类类型,也可能是派生类类型

vector<shared_ptr<Quote>> basket;
basket.push_back(make_shared<Quote>("0-201-82470-1", 50));
basket.push_back(make_shared<Bulk_quote>("0-201-54848-8", 50, 10, 0.25));
//就像派生类的指针可以转换成基类指针
//这里派生类的智能指针转换成了基类的智能指针
//make_shared<Bulk_quote>返回指向Bulk_quote的智能指针
//调用push_back时将该智能指针转换成Quote的智能指针
cout << basket.back()->net_price(15) << endl;

实现

class Basket
{
public:void add_item(const shared_ptr<Quote> &sale) { items.insert(sale); }//打印每本书的总价和购物篮中所有书的总价double total_receipt(ostream&) const;
private:static bool compare(const shared_ptr<Quote> &lhs, const shared_ptr<Quote> &rhs){ return lhs->isbn() < rhs->isbn(); }multiset<shared_ptr<Quote>, decltype(compare)*> items{compare};//multiset存放交易信息,可以保存同一本书的多条交易记录//shared_ptr没有定义小于运算符,所以定义上面的compare
};

可能multiset不太容易理解,从左向右读实际就是一个指向Quote对象的shared_ptr的multiset,这个multiset使用一个和compare成员类型相同的函数来对其中的元素进行排序。multiset的名字是items,我们初始化items并令其使用我们的compare函数

定义Basket成员

total_receipt

total_receipt函数负责将购物篮的内容逐项打印成清单,最后返回总价格

double Basket::total_receipt(ostream &os) const
{double sum = 0.0;for (auto iter = items.cbegin(); iter != items.end(); iter = items.upper_bound(*iter))//upper_bound返回一个迭代器,该迭代器指向所有和iter关键字相等的元素的后一个元素的像一个位置sum += print_total(os, **iter, items.count(*iter));//*iter是指向准备打印对象的指针,**iter是准备打印的对象,可能是Quote也可能是派生类//count是multiset的函数,用来统计multiset有多少元素键值相同os << "Total Sale: " << sum << endl;return sum;
}

add_item

现在的add_item接受一个shared_ptr参数,也就是说购物篮的用户必须自己处理动态内存。我们应该重新定义add_item,接受一个Quote对象而不是shared_ptr。新的add_item负责处理内存分配,这样用户就会省事了

//定义两个,一个拷贝,一个移动
void add_item(const Quote& sale);
void add_item(Quote&& sale);

还有个问题是add_item不知道要分配什么类型。进行内存分配时会拷贝(移动)sale参数,所以肯定会有这样的表达式new Quote(sale)。这里是分配Quote 类型的对象,然后拷贝sale的Quote部分,但sale也能是Bulk_quote对象,这样的话派生类部分又被切掉了…

模拟虚拷贝

为了解决上面的问题,我们给Quote添加一个虚函数,这个函数返回当前对象的动态内存

class Quote
{
public://该虚函数返回当前对象的一份动态分配的拷贝virtual Quote* clone() const & {return new Quote(*this);}//const左值引用成员将自己拷贝到新分配的对象virtual Quote* clone() && {return new Quote(std::move(*this));}//右值引用成员将自己移动到新数据
};
class Bulk_quote
{Bulk_quote* clone() const & {return new Bulk_quote(*this);}Bulk_quote* clone() && {return new Bulk_quote(std::move(*this));}
};

然后重新写add_item

class Basket
{
public:void add_item(const Quote& sale){ items.insert(shared_ptr<Quote>(sale.clone())); }void add_item(Quote&& sale){ items.insert(shared_ptr<Quote>(std::move(sale).clone()));}//这样动态类型就能决定返回谁的动态内存
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

基于域名访问网站1(作业)

搭建一个基于http://www.zuoye.com:22222访问的web网站&#xff0c;网站首页在/www/http/&#xff0c;内容为zuoye 结果 过程&#xff1a; 创建网页的根目录&#xff0c;并编辑网页内容为zuoye 编辑/etc/httpd/conf.d/zuoye.conf 关闭防火墙 关闭selinux 重启httpd 编辑/…...

虚拟内存和地址空间

目录 一、物理内存vs虚拟内存 二、物理内存空间和虚拟内存空间 三、32bit的地址空间 四、cpu位宽和cpu地址总线宽 五、虚拟内存地址空间划分 六、虚拟地址和物理地址的映射 早期的计算机程序都是直接跑在物理内存上的&#xff0c;这就要求程序大小不能超过物理内存的上限…...

HttpClient请求Https证书问题解决

本地使用HttpClient请求https时没有问题&#xff0c;但是放到服务器上&#xff0c;运行出现报错&#xff0c;出现异常为&#xff1a; javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.ce…...

STM32CubMx自学笔记(一)-LED灯翻转

STM32CubMX自学笔记&#xff08;一&#xff09;---LED灯翻转工程创建系统具体配置工程代码编写下载验证结语工程创建 首先得安装STM32CubMx软件。具体安装步骤参照 保姆级安装步骤&#xff0c;这里将不再赘述&#xff0c;第一节主要是介绍新工程的创建&#xff0c;首先在桌面打…...

十四、Python第十四课——文件和异常

&#xff08;请先看这篇文章&#xff1a;https://blog.csdn.net/GenuineMonster/article/details/104495419&#xff09; 如果看完这篇博文&#xff0c;你的问题还是没有解决&#xff0c;那么请关注我的公众号&#xff0c;后台发消息给我吧&#xff0c;当天回复&#x…...

LeetCode: 523. 连续的子数组和

给你一个整数数组 nums 和一个整数 k &#xff0c;编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组&#xff1a; 子数组大小 至少为 2 &#xff0c;且 子数组元素总和为 k 的倍数。 如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …...

Linux下安装sqlite3

文章目录前言安装步骤测试安装成功前言 sqlite3的安装 安装步骤 依次执行以下命令&#xff1a; 1)wget http://www.sqlite.org/sqlite-3.5.6.tar.gz 2)tar -xzvf sqlite-3.5.6.tar.gz 3)cd sqlite-3.5.6 4)./configure 5)make 6)make install测试安装成功 出现红色方框信息…...

面向对象的程序语言设计-2021春季学期面向对象程序设计第十四周上机练习#1

Set 描述 现有一整数集&#xff08;允许有重复元素&#xff09;&#xff0c;初始为空。我们定义如下操作&#xff1a; add x 把x加入集合 del x 把集合中所有与x相等的元素删除 ask x 对集合中元素x的情况询问 对每种操作&#xff0c;我们要求进行如下输出。 add 输出操作后集…...

拉伯配资6月1日策略

5月回想&#xff1a;在5月份的战略中&#xff0c;我们认为其时胶着的商场可能在5月会有所改动。从实践表现来看&#xff0c;5月下旬商场明显出现了一些活泼做多的信号&#xff0c;商场也选择了向上打破。上证指数上涨超4%&#xff0c;深圳成指上涨近3%。 行情判别&#xff1a;从…...

词达人自动做题PHP版全套开源+前后台分离开发+带半个软件+CDKey兑换

简介&#xff1a; 开发语言&#xff1a;PHPMysql 源码简介与安装说明&#xff1a; 易语言版的我是今天写的。多线程有需要再去调风控&#xff0c;恶心的一批。我这网课上到现在基本上啥TM也没学。就这样了。我就简单上几张图自己看看吧。前端是Vue.js。后端是PHP。前后台分离…...

在一家公司干多长时间跳槽才合适?最全的BAT大厂面试题整理

本篇文章主要内容 数据缓存 为何要使用缓存 哪类数据适合缓存 缓存的利与弊 如何保证缓存和数据库一致性 不更新缓存&#xff0c;而是删除缓存 先操作缓存&#xff0c;还是先操作数据库 非要保证数据库和缓存数据强一致该怎么办 缓存和数据库一致性实战 实战&#xff…...

前端javascript中Location的使用

标题location的常用方法&#xff1b; location.search.slice(1) // 取url中?之后的部分 location.hash.substring(1) //取url中#之后的部分 通过javascript跳转&#xff1a; location.href() location.assign() location.replace()...

微信小程序趋势及前景,大厂直通车!

最近看到群里看到一个女生&#xff0c;讲述了她从开始选择Android&#xff0c;经过非常努力的学习和挣扎&#xff0c;然而最后面对当前的环境却不得不放弃。看完以后真的非常替她感觉惋惜&#xff0c;如果早几年入行可能结果会比现在好很多&#xff0c;但可惜&#xff0c;这就是…...

LAMP源码编译安装(Apache,Mysql,PHP,论坛安装详解)

目录前言一.LAMP概述1.LAMP架构2.LAMP组件的主要作用二.Apache httpd服务编译安装1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下2.安装环境依赖包3.配置软件模块4.编译及安装5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件放入路径环境变量的目…...

[Jetson][转载]jetson上安装pytorch+torchvision教程

1. Jetpack默认已安装opencv、cuda、cudnn&#xff0c;故只需再安装pytorch即可&#xff0c;留意jetson是arm架构&#xff0c;需要下载对应的安装文件加以安装  2. pytorch的安装   查询Jetpack的版本 sudo -H pip3 install jetson-stats jetson_release   pytorch的whl文…...

sort在不同浏览器下执行效果

sort在不同浏览器下执行效果 let arr [{name: zhangsan, age: 40},{name: lisi, age: 20},{name: laowang, age: 50},{name: xiaoli, age: 60},{name: xiaojin, age: 30}, ] arr.sort((a, b) > b.age > a.age);上面这段代码在谷歌浏览器中&#xff0c;是不会进行排序的…...

设计模式导读助记

各个设计模式的详细介绍都已经完成&#xff0c;但是不经常用总会忘&#xff0c;所以我想用 一句话 总结设计模式&#xff0c;思考模式的真正意图&#xff0c;再用 一点提示 来思考代码如何实现 写在前面 我整理的设计模式这一个系列&#xff0c;主要是结合了以下几本书 : 《设…...

RT-Thrad|STM32F103+ESP8266 S01+RT-Thread联网之环境搭建(1/3)

文章目录前言硬件准备百问网STM32F103ESP8266 01SESP8266 介绍ESP8266 01S技术规格参数软件准备下载安装 Keil μVision5Pack Installer安装 ST-Link 驱动获取RT-Thread源码下载安装 RT-Thread env 工具文章列表 RT-Thrad|STM32F103ESP8266 S01RT-Thread联网之环境搭建(1/3)RT…...

Flask初体验

Flask初体验 flask框架是一个微型框架&#xff0c;但是微型框架不代表功能比其他框架少&#xff0c;并且flask的约束也比较少&#xff0c;使用更加方便。Flask安装 pip install flask 废话不多说直接上代码 from flask import Flaskapp Flask(__name__)app.route("/&qu…...

天眼查怎么删除信息_天眼查删除信息的方法介绍

天眼查信息怎么删除 天眼查风险信息怎么清除 天眼查问答信息怎么删除 天眼查法律诉讼信息可以删吗 天涯查上的信息删除怎么操作&#xff0c;天眼查成立于2014年&#xff0c;至今发展迅速&#xff0c;已经帮助了无数的企业和消费者&#xff0c;那么很多企业的天眼查信息有时候需…...

HDU-2084 数塔

HDU-2084 数塔 题目链接&#xff1a;添加链接描述 #include<bits/stdc.h> using namespace std; int main() {int C,N,i,j;int a[101][101],dp[101][101];cin>>C;while(C--){cin>>N;memset(dp,0,sizeof(dp));for(i1;i<N;i){for(j1;j<i;j){cin>>…...

CSS的三种基础选择器,万字长文!

什么是HTML? HTML: ( Hypertext Markup Language )超文本标记语言&#xff0c;是一种标识性的语言。它包括一系列标签&#xff0e;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的Internet资源连接为一个逻辑整体。 特点: 简易性&#xff1a;超级文本标记语言版…...

MySQL高级(二)——锁与事务

MySQL高级&#xff08;二&#xff09;——锁与事务 文章目录MySQL高级&#xff08;二&#xff09;——锁与事务一、MySQL锁机制**1.1 锁与其应用场景锁的类型和适合的场景读阻塞写、写阻塞读手动锁定一行实现一个事务行锁升级为表锁的情况间隙锁的问题1.2 事务与MySQL隔离级别1…...

数据分类分级标准指南

数据分类分级标准指南&#xff0c;定级标准&#xff0c;参考影响对象、程度、范围三个纬度&#xff0c;按照5个等级进行处理&#xff0c;如下&#xff1a; 级别名称 级别程度 详细说明 L1 绝密 这是极度敏感的信息&#xff0c;如果受到破坏或泄漏&#xff0c;可能会使组织…...

容器盛水问题

题1:盛最多水的容器 解题&#xff1a;双指针 初始两个左右指针&#xff0c;可容纳水量min&#xff08;左指针&#xff0c;右指针&#xff09;*指针间距 S(i, j) min(h[i], h[j]) (j - i)移动数字较小的指针,min(h[i],h[j])可能变大 public class Solution {public int maxA…...

一篇文章带你学会Android

书籍&#xff1a; 《第一行代码》 《Android开发艺术探索》 《Android进阶之光》 《Android进阶解密》 大佬博客&#xff1a; 郭霖&#xff1a;https://blog.csdn.net/guolin_blog 袁辉辉&#xff1a;http://gityuan.com 刘望舒&#xff1a;http://liuwangshu.cn 微信公众号&am…...

CentOS7集群安装配置NTP服务器

目录1. 准备节点2. 安装配置 server 节点2.1 下载安装2.2 编辑配置文件2.3 启动服务3. 安装配置 Client 节点3.1 下载安装3.2 同步时间3.3 编辑配置文件3.4 启动服务4. 测试1. 准备节点 不管你有多少个节点&#xff0c;肯定要有一个 server 角色&#xff0c;至于谁是 server 你…...

shedLock使用redis作为数据源进行多实例@Scheduled任务调度

文章目录github地址pom依赖添加yml配置数据源config配置&#xff08;数据源 shedLock&#xff09;定时任务添加shedLock注解任务执行起来之后&#xff0c;redis中的数据格式github地址 https://github.com/lukas-krecan/ShedLock pom依赖添加 <!-- redis组件-->…...

文章被其他网站盗用怎么办

今天无意中发现自己前两天写的博客居然被其他网站盗用了&#xff0c;而且连个转载地址都不贴&#xff0c;我真是气得七窍生烟&#xff01;反而咱呕心沥血的原创无论如何都搜不到。。。 真是大写的TM&#xff01; 右键举报&#xff0c;进去后百度要求实名认证&#xff0c;好吧&a…...

CSS文本样式值,附详细答案

开始 我大学读的是大专&#xff0c;在学校学的是机电一体化。临近毕业的时候选择了学习web前端技术&#xff0c;因为做机电实在又累工资又低&#xff0c;而我更喜欢坐办公室的工作&#xff0c;有空调吹&#xff0c;我很现实&#xff0c;就是想多赚一点钱。到现在做了两年前端的…...

Blender渲染分辨率如何优化设置?这些渲染技巧你要知道

尽管Blender不断改进其功能&#xff0c;随着硬件的不断进步而变得越来越复杂&#xff0c;该软件最好的是允许很多人免费试用它。但即使所有人都可以访问&#xff0c;这并不意味着Blender可以克服低端GPU的局限性。 并非所有PC都是平等的&#xff0c;也不是每个3D设计师都可以使…...

常用的5个渲染农场渲染价格测试

最近发现扮家家渲染农场降价了&#xff0c;于是提交了3张效果图到经常用的几个渲染农场进行对比一下&#xff0c;看看他们的渲染费究竟哪家便宜&#xff0c;我们一起来看看。 先看结果&#xff1a; 三张效果图在5个渲染农场的渲染费用由低到高分别在炫云花了0.996元&#xff…...

渲染服务器操作系统,如何用服务器做渲染

如何用服务器做渲染 内容精选换一换&#xfffd;&#xfffd;&#xfffd;&#xfffd;BoostKit ARMԭ&#xfffd;&#xfffd;ʹ&#xfffd;&#xfffd;&#xfffd;׼&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;嵥&#xfffd;&#xfffd…...

图形渲染——伽马矫正

这个话题一直是我的一个困扰,因为我看了Unity Shader的讲解,总感觉作者是不是把问题搞反了,前后叙述是矛盾的。后来经过反复查看,可以肯定作者是对的,但是因为表述不清楚或者太啰嗦,把一些重点给掩盖在了文字里边,现在我要来重点梳理一下干货: 一、为什么要使用伽马编…...

渲云和渲染100哪个好?

很多设计师和工作室都选择将文件放到渲染平台进行渲染&#xff0c;因为云渲染能快速出图的同时&#xff0c;又不占用本地机器&#xff0c;文件在云端渲染&#xff0c;本地电脑也能正常作图。 现在市场上云渲染的平台很多&#xff0c;选择什么样的平台稳定、价格实惠&#xff0…...

MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

一、准备工作 首先需要准备好环境&#xff0c;包含必要的软件&#xff0c;痞子衡的环境如下&#xff1a; 集成开发环境&#xff1a; MCUXpresso IDE_11.6.0_8187&#xff0c;点此下载软件开发包&#xff1a; SDK_2.12.1_EVK-MIMXRT1170&#xff08;Toolchain需包含MCUXpresso I…...

linux操作系统之 组管理 终端命令(添加组删除组等命令)详解 简单易懂~

1.组管理终端命令如下&#xff1a; &#xff08;1&#xff09;添加组&#xff1a; groupadd 组名 &#xff08;2&#xff09;删除组&#xff1a;groupdel 组名 &#xff08;3&#xff09;确认组的信息&#xff1a;cat /etc/group&#xff08;查看etc下的group文件&#xff09; …...

Windows命令行 创建账户、添加权限组

1.打开【运行】输入 cmd 输入以下命令添加用户&#xff1a; net user admin 123456 /add 此命令添加用户名为 admin 密码为 123456 2.接下来添加该用户到administrator组 net localgroup administrators admin /add 3. 提示命令成功就创建了一个管理员权限账户 参考链接 …...

计算机怎么加入用户组,将标准用户添加到管理员组 怎么将普通用户加入管理员组...

将标准用户添加到管理员组步骤工具/原料windows7系统电脑方法/步骤1、鼠标双击桌面上的“计算机”&#xff0c;然后在弹出的菜单里左键单击“管理”选项卡2、在“计算机管理”窗口里&#xff0c;鼠标双击打开“本地用户和组”选项卡。3、打开“本地用户和组”选项卡后&#xff…...

Gitlab----管理员创建组并添加成员

【原文链接】 1 管理员root登录gitlab&#xff0c;依次【Menu】-【Admin】 2 点击【Group】-【New Group】 3 设置组的资料 如下&#xff0c;设置组名为demo&#xff0c;描述简要描述组的用途等&#xff0c;访问级别根据实际情况填写&#xff0c;比如公司内部可以设置为私有&…...

Win11和Win10家庭版添加组策略gpedit.msc

【如果您感觉这系列文章有用&#xff0c;还请帮我点个赞&#xff0c;收个藏&#xff0c;让更多的人看到这篇文章】 目录 1、桌面右键&#xff0c;【新建】-【文本文档】&#xff1b; 2、输入以下代码&#xff1b; 3、将txt文件后缀名改为.cmd 4、以管理员身份运行cmd文件&a…...

如何为电脑添加组策略

本地组策略编辑器是一个 Microsoft 管理控制台 (MMC) 管理单元&#xff0c;它提供一个单一用户界面&#xff0c;通过该界面可管理本地组策略对象&#xff08;GPOs&#xff09;。通常打开方式都是按 Win R 组合键&#xff0c;打开运行&#xff0c;并输入&#xff1a;gpedit.msc…...

ubuntu添加用户到组_如何在Ubuntu中将现有用户添加到组中?

ubuntu添加用户到组Ubuntu is a popular distributions used by a lot of companies as Desktop and Server. As a system administrator one of the most recurring job is changing existing user group. In this tutorial we will look how to accomplish this task and so…...

Linux用户组介绍:如何添加新组,新组成员和更改组

Linux allows multiple users to have access to the system at one time. Setting permissions protects users from each other. Users can be assigned to groups that are created for users who share privilege, security, and access. Files and devices may be grante...

linux用户与组的管理(命令添加、手动添加、添加组、用户之间的切换)

一、用户登录的时候需要验证的是这两个文件 检测用户名 Login: root 到该目录下检查 /etc/passwd 检测用密码 Passwd: 123456 到该目录下检查 /etc/shadow /etc/Passwd下的 字段&#xff08;每一行为一个用户&#xff09; 语法&a…...

linux添加组播路由命令,linux – 所有接口的组播路由

我有一堆程序产生多播流量,我希望在网络上看到wifi和以太网,但我也希望它们在网络出现故障时不会死于“无路由”.所以我真正想要的是将所有多播流量从一台机器路由到所有可用的接口,或者在没有接口的情况下进行环回.在Linux上我可以说&#xff1a;sudo ifconfig lo multicastsu…...

用户组及添加用户到组_如何将用户添加到组?

用户组及添加用户到组In Linux users may have different groups registered. By default adding a user to the Linux system will create new user. There are different commands to change user group one of them is useradd which actually create new user and sets giv…...

利用CMD命令添加用户与组

Net User 作用&#xff1a;添加或更改用户帐号或显示用户帐号信息。命令格式&#xff1a;Net user [username [password | *] [options]] [/domain]   有关参数说明&#xff1a; 键入不带参数的Net user查看计算机上的用户帐号列表username添加、删除、更改或查看用户帐号名…...

linux修改组命令groupmod,添加用户useradd,修改用户usermod,添加组groupadd

在/etc/group文件中可以看到,需要修改的组信息并不多。修改组的GID(加-g选项) 或组名(加-n参数) 添加一个组,为了节省博客篇幅,删除了部分组信息 [root@localhost home]# groupadd test [root@localhost home]# cat /etc/group root:x:0: bin:x:1: daemon:x:2: sys:x:3: a…...

linux如何把用户加组内,在Linux中将用户添加到特定组的四种方法

在Linux中将用户添加到特定组的四种方法Linux组是用于管理Linux中用户帐户的组织单位。对于Linux系统中的每个用户和组&#xff0c;它都有唯一的数字标识号。它称为用户ID(UID)和组ID(GID)。组的主要目的是为组的成员定义一组特权&#xff0c;它们都可以执行特定的操作&#xf…...