多重收纳(类模板)C++

目录

题目描述

思路分析

AC代码


题目描述

现在我们要制作一种盒子,它能够收纳多种类型的元素,比如int、double、char、string等等。

我们每接收到一个数据都将它用这种盒子包装起来,然后放到同一个vector中。

为了能够包装不同类型的元素,我们决定用模板类来实现这种盒子,并起名为CBox.

然而,我们注意到CBox<int>、CBox<char>等类虽然定义自相同的模板类,但实际上它们是不相容的类型。

为了能够放到一个vector中,我们决定为CBox模板类定义一个抽象父类CBoxObject。

这样我们就能利用父类指针将不同的CBox实例类对象集中放到一个vector<CBoxObject*>中啦。

下面给出CBoxObject抽象类的定义:(不可修改)

class CBoxObject {

protected:

    string type; // 记录类型信息

public:

    CBoxObject(string _type) : type(_type) {}

    virtual void show(ostream&) const = 0; // 用于输出信息

};

为了查看vector中任意盒子的数据,我们决定采用多态的技术来实现:

1. 要求CBox模板类继承CBoxObject类,并且要定义一个成员变量;

2. CBox要实现父类虚函数void show(ostream&),show函数将信息输出到ostream中,

   1) 一般输出格式为:{type: value}

   2) 如果元素为空指针,则输出为:{}

3. 为CBox模板类添加void setVal(T _val)函数,以便于修改数据

下面给出测试主函数如下:(不可修改)

template<typename T>

void pushBox(istream& in, vector<CBoxObject*>& container, const string& type) {

    T val;

    in >> val;

    container.emplace_back(new CBox<T>(type, val));

}

int main() {

    string type; // 数据类型

    int n, index; // n为输入次数,index为vector数组下标

    cin >> n;

    vector<CBoxObject*> pBoxes;

    pBoxes.reserve(n); // 预先分配足够的空间(pBoxes.size()==0依然成立)

    while (n-- > 0) {

        cin >> type;

        // 根据数据类型分别包装

        if (type == "char") pushBox<char>(cin, pBoxes, type);

        else if (type == "int") pushBox<int>(cin, pBoxes, type);

        else if (type == "double") pushBox<double>(cin, pBoxes, type);

        else if (type == "string") pushBox<string>(cin, pBoxes, type);

        // 我们觉得一个盒子也是可以包装另一个盒子的

        // 为了便捷起见,我们采用盒子指针来表示盒子间的包装关系

        else if (type == "box") {

            cin >> index;

            auto box = new CBox<CBoxObject*>("box", nullptr);

            // 根据index从pBoxes已有的盒子中选择一个用新盒子包装

            if (0 <= index && index < pBoxes.size()) {

                box->setVal(pBoxes[index]);

                // 现实中盒子是不能自己包装自己的

                // 在本题中,如果盒子自己包装自己,则将指针值设置为空

                // 本题暂不考虑链表成环问题

            }

            pBoxes.emplace_back(box);            

        }

        index = (int)pBoxes.size() - 1;

        cout << *pBoxes[index] << endl;

    }

    for (CBoxObject*& box : pBoxes) delete box;

    return 0;

}

在决定使用CBoxObject*原生指针类型作为CBox的模板参数时,你可能会发现一个问题:

a)如果包装的值是"空指针nullptr"(NULL倒不会),则在输出时会出现问题!

b)如果包装值是非空指针,那么一般来说打印指针值是没有什么价值的,我们更关注的是指针所指向的内容。

我们希望能够对T*这样的模板参数类型定义不同处理方式。

通过进一步学习可以了解到c++支持的"模板偏特化"方法:

template<typename T> class CC { ...... };

template<typename T> class CC<T*> { ...... };

template<typename T> class CC<const T*> { ...... };

......

4. 为CBox模板类定义适合以原生指针作为模板参数的特化版本

    由于定义的成员变量为指针类型,且同一对象被new出来后可能被赋予多个所有者,

    为了简化编程,本题不考虑析构函数(使用默认的即可)

(要进一步保障复制和析构安全性,避免内存泄露,可以考虑加入"引用计数指针"进一步完善定义,本题目不作要求)

   本题的特化版本为:

   template <>

   class CBox<CBoxObject *> :public CBoxObject

   {

       CBoxObject *data;

在处理输出时,你可能会写出"cout<<val;"和"cout<<*val;"这样的语句以通用于int*,string*等其它原生指针

如果使用了CBox<T*>,请注意为相应的T类要有输出重载

5. 为CBoxObject类重载输出

输入

参见主函数

输出

输出格式:{type: value}

如果为value为空指针(nullptr),则输出为:{}

输入样例1

输出样例1

思路分析

首先要看出来它用了标准模板库STL的vector,我们要包含vector头文件。

然后就是对于指针类型的我们需要特例化,不让它调用通用模板,另外写一个。

有时候会报这种错误:[Error] an explicit specialization must be preceded by 'template <>'。

 

然后就需要加上template<>。

就是为了对于特定类型来执行不同的代码,而不是去调用通用模板。

AC代码

ostream& operator<<(ostream& out, CBoxObject& box) {box.show(out);return out;
}
ostream& operator<<(ostream& out, CBoxObject* box) {box->show(out);return out;
}
template<class T>
class CBox: public CBoxObject {protected:T value;public:CBox(string type, T value): CBoxObject(type), value(value) {}virtual void show(ostream& out)	const{out << '{' << type << ": " << value << '}';}void setVal(T _val) {value = _val;}
};
template<> 
class CBox<CBoxObject*>: public CBoxObject {protected:CBoxObject* value;public:CBox(string type, CBoxObject* value): CBoxObject(type), value(value) {}virtual void show(ostream& out)	const{if(value)out << '{' << type << ": " << value << '}';else out<<"{}";}void setVal(CBoxObject* _val) {value = _val;}
};

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

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

相关文章

AJAX框架衣柜收纳技巧,史上最强衣柜收纳神技!看完我一口气收拾了189件衣服……...

来源&#xff1a;有品生活 ID&#xff1a;pinpinlife 要说家里最容易乱的地方&#xff0c; 排第一位的肯定是衣柜了&#xff0c; 衣服不收好&#xff0c;出门翻箱倒柜都找不到&#xff0c; 找到脾气都上来了&#xff0c; 还谈什么开启一天好心情&#xff1f; 今天春姐姐就和大家…

概念收纳

凸 凸集的定义为&#xff1a; 其几何意义表示为&#xff1a;如果集合C中任意2个元素连线上的点也在集合C中&#xff0c;则C为凸集。其示意图如下所示&#xff1a; 常见的凸集有&#xff1a; n维实数空间&#xff1b;一些范数约束形式的集合&#xff1b;仿射子空间&#xff1b;…

win10桌面管理文件收纳_放心的电脑桌面收纳工具必备,电脑桌面win10应用商店

放心的电脑桌面收纳工具必备 可以用下面的方法恢复&#xff1a;在windows文献夹&#xff0c;或是其他文献夹中新建一个文本文献&#xff0c;文献名为“显示桌面”&#xff0c;或是另存为也可以&#xff0c;这时候文献图标就变成显示桌面的图标了&#xff0c;将其放入快速启动栏…

整理收纳的概念和意义

在各位心中&#xff0c;整理是否是一种“让杂乱无章的环境变得干净整齐”的行为呢?因为忙于工作&#xff0c;我们的家总是会在不知不觉中变得凌乱。很多人认为&#xff0c;整理是要等家里乱了之后才不得不进行的一种善后行为。但其实整理的初衷&#xff0c;并非单纯的善后希望…

软件测试工具收纳整理,最新收纳整理软件测评 什么值得用?!!

最新收纳整理软件测评 什么值得用&#xff1f;&#xff01;&#xff01; 2021-01-20 20:43:02 2点赞 0收藏 1评论 创作立场声明&#xff1a;在使用过一些收纳软件后的一些感受&#xff0c;分享给大家&#xff0c;希望对大家挑选适合自己的生活助手有所帮助。自己的东西多又杂不…

软件测试工具收纳整理,全网最良心的收纳整理App测评 抠细节抠到眼瞎!!!...

全网最良心的收纳整理App测评 抠细节抠到眼瞎&#xff01;&#xff01;&#xff01; 2021-01-08 19:16:21 6点赞 36收藏 2评论 创作立场声明&#xff1a;我在本文中的软件测评来自自我使用后心得&#xff0c;希望能够与大家分享&#xff0c;做出一定帮助。 这款收纳神器&#x…

牛客 方块与收纳盒

题目链接 1001-方块与收纳盒_2021秋季算法入门班第七章习题&#xff1a;动态规划1 (nowcoder.com) 一道简单的线性dp的题目&#xff08;入门题目&#xff09; 题面分析&#xff1a;有一个n*1大小的盒子&#xff0c;你有无限个1*1和2*1的小方块&#xff0c;问你有几种方法可以把…

计算机桌面收纳盒进么建立,桌面收纳盒制作图解教程

1.喜欢这款公主收纳盒么很有点公主风吧&#xff0c;下面就教大家自制收纳盒DIY的方法-用包装纸盒制作一个公主风收纳盒制作方法 这上面看起来简单很随意的褶皱效果啊 可让我吃了一翻苦头的~~完成后呢 得意呢这儿一个那儿一个的到处找不到家的小家伙们统统收集进来~~可爱的指…

AgentGPT-带互联网搜索功能的chatGPT

AgentGPT-带互联网搜索功能的chatGPT 20230425145426|left|475 &#x1f308;Description&#xff1a; ​ Agent GPT 主要的AI 功能就是建立在原版的AutoGPT 之上&#xff0c;然后再加上图形介面&#xff0c;这样阅读起来比较容易也比较方便。 相较于ChatGPT&#xff0c;它具有…

上传图片,使用很简单的办法上传图片

使用很简单的办法上传图片 1. 首先把上传的页面写好 <!DOCTYPE html> <html xmlns:th"http://www.w3.org/1999/xhtml"> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0&…

.Net图片上传

效果图&#xff1a; 代码如下&#xff1a; 引用&#xff1a;js&#xff0c;css bootstrap-fileupload.min.js bootstrap-fileupload.min.css FileSize.js 附件下载请点击这里 View里的代码&#xff1a; <div class"row">using (Html.BeginForm("Create…

图片上传(调用微信接口)

图片上传之原生方法 图片上传、压缩、回显、缩略图放大、删除、下载&#xff0c;可以参考这儿&#xff08;h5方法&#xff09; https://github.com/zhangstar1331/pictureUpload 效果展示 背景 图片上传&#xff0c;我们一般用下面的H5方法&#xff0c;但是在安卓手机上无法…

Qt模仿安卓手机中app图标移动

一、简述 最近使用Qt中的拖拽事件加上一些动画效果模仿了安卓手机中日常用的app图标拖动&#xff0c;目前支持横向移动。 通过判断当前拖动鼠标的位置来进行选择是否进行动画移动前后的按钮。

关于android手机桌面应用图标的角标通知

vivo桌面角标通知&#xff1a; 网上有相关的代码实现方式&#xff0c;但是经过vivo官方文档没有找到对应方法&#xff0c;于是找到客服给我的回复是未开放此功能&#xff0c;具功能只对指定应用开放&#xff0c;下面是客服的回复截图 小米桌面角标通知&#xff1a; 文档里面有…

android修改状态栏图标大小,安卓手机状态栏图标位置修改教程

安卓手机状态栏图标等等都可以修改&#xff0c;包括手机信号、电池等等他们的图标位置都是可以互换的&#xff01;下面就来教大家修改状态栏&#xff0c;以及安卓手机状态栏图标位置互换教程&#xff01; 修改具体方法&#xff1a; 1、反编译原文件framework-res.apk&#xff0…

Android 中更改了默认app图标,在手机上还是显示默认图标

注意 启动图标名称勿用默认名称&#xff0c;改为自定义的名称&#xff0c;比如ic_launcher_k&#xff0c;ic_launcher_自定义&#xff0c;防止启动图标找到第三方引用的图标&#xff0c;导致不是想要的logo <applicationandroid:name".KApplication"android:allow…

Android如何确定显示图标

在AndroidManifest.xml中<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.hh.practice"><applicationandroid:allowBackup"true"…

数据科学在文本分析中的应用 :中英文 NLP(下)

回顾上篇&#xff0c;我们详细介绍了如何实现猫途鹰网站的中英文评论数据采集、入库和清理。本篇中&#xff0c;我们会重点介绍数据建模的原理和代码实现&#xff0c;其中包括 emoji 分析、情感分析、分词、词性词频分析、关键词分析、词云和主题模型文本分类。 数据建模 在这…

“人机之恋”升级:GPT让虚拟伴侣更会聊天,也更危险

一位用户表示&#xff0c;AI“小人儿”会主动找话题聊天&#xff0c;虽然有时候的回答很诡异&#xff0c;但随着聊天不断进行下去&#xff0c;AI会“训练”自己的角色&#xff0c;行为越来越贴近用户的感情需求。 截至目前&#xff0c;豆瓣“人机之恋”小组已有9498名成员。Rep…

AKA「虚拟女友」,月入500万美元,谈恋爱按分钟计费

来源&#xff1a;新智元 各种逼真的AI工具火了之后&#xff0c;各路心思活泛的选手都开始大显神通了&#xff0c;有卖果照的&#xff0c;有给自己造AI老婆的。 AI女友&#xff0c;俨然已经成为一个巨大的市场。 这不&#xff0c;最近一位名叫Caryn Marjorie的网红&#xff0c;根…