C++泛型编程-类模板的项目实战实现基础的Vector的编写

news2025/1/12 12:01:36
请设计一个数组模板类( Vector ),完成对 int char float double 以 及任意的自定义类等类型元素进行管理。
需求
a. 实现构造函数
b. 实现拷贝构造函数
c. 实现 cout << 操作
d. 实现下标访问符 [] 的重载操作
e. 实现 = 号操作符重载

.h

#pragma once
#include <iostream>
using namespace std;
template<typename T>

class Vector{
public:
	Vector();
	Vector(int len);
	//定义一个下标运算符重载
	T& operator[](int index);
	//获取数组长度
	int getLen();
	//设置拷贝构造函数,实现定义时赋值
	Vector(const Vector& other);
	//设置赋值运算符重载实现定义后赋值
	Vector& operator=(const Vector& other);

	~Vector();
private:
	int len;
	T* m_len;
	template<typename T>
	friend ostream& operator<<(ostream& os, Vector<T>& vector);
};
template<typename T>
ostream& operator<<(ostream& os, Vector<T>& vector) {
	for (int  i = 0; i < vector.len; i++)
	{
		os << vector.m_len[i] << endl;
	}
	return os;
}


 .cpp

#include "Vector.h"
template<typename T>
Vector<T>::Vector()
{
}
template<typename T>
Vector<T>::Vector(int len){
	if (len>0){
		this->len = len;
		m_len = new T[len];
	}
}
//实现通过下标赋值
template<typename T>
T& Vector<T>::operator[](int index)
{
	return m_len[index];
}
//获取数组长度
template<typename T>
int Vector<T>::getLen()
{
	return len;
}
//拷贝构造函数
template<typename T>
Vector<T>::Vector(const Vector& other)
{
	//拷贝构造函数不存在判空
	this->len = other.len;
	m_len = new T[len];
	//开始数据拷贝
	for (int i = 0; i < other.len; i++){
		this->m_len[i] = other.m_len[i];
	}
}
//aa=bb=cc
template<typename T>
Vector<T>& Vector<T>::operator=(const Vector<T>& other){
    //需要进行判空,因为链式拷贝
	if (this->m_len!=NULL)
	{
		delete[] m_len;
		m_len = NULL;
		len = 0;
	}
	//实现数据拷贝
	this->len = other.len;
	m_len = new T[len];
	//开始数据拷贝
	for (int i = 0; i < other.len; i++) {
		this->m_len[i] = other.m_len[i];
	}
	return *this;//实现链式拷贝,
}

template<typename T>
Vector<T>::~Vector()
{
	if (m_len!=NULL)
	{
		delete[] m_len;
		m_len = NULL;
		len = 0;
	}
}

主函数

#include <iostream>
#include <Windows.h>
#include "Vector.cpp"

using namespace std;

class Man {
public:
	Man() {
		age = 0;
		name ="位置";
	};
	Man(const char* name, int age) {
		this->name = name;
		this->age = age;
		
	}
	friend ostream& operator<<(ostream& os, Man& man);
private:
	int age;
	string name;
};
//函数重载Vector的左移运算符重载
ostream& operator<<(ostream& os, Man& man) {
	os << man.name <<" " << man.age << " ";
	return os;
}
int main(void) {
	Vector<int> aa(10);
	for (int  i = 0; i < aa.getLen(); i++){
		aa[i] = i;
	}
	//调用拷贝构造函数
	Vector<int> aa1 = aa;
	//调用赋值构造函数
	Vector<int> aa2, aa3;
	aa3 = aa2 = aa;
	for (int i = 0; i < aa.getLen(); i++)
	{
		cout << aa[i]<<" ";
	}
	system("pause");
	cout << "为浮点数时:" << endl;
	Vector<double> bb(4);
	for (int i = 0; i < bb.getLen(); i++) {
		bb[i] = i*0.1;
	}
	for (int i = 0; i < bb.getLen(); i++)
	{
		cout << bb[i] << " ";
	}
	system("pause");
	//通过拷贝构造函数
	cout << "通过拷贝构造函数:" << endl;
	for (int i = 0; i < aa1.getLen(); i++)
	{
		cout << aa1[i] << " ";
	}
	//通过赋值构造函数
	system("pause");
	cout << "通过赋值构造函数:" << endl;
	for (int i = 0; i < aa2.getLen(); i++)
	{
		cout << aa2[i] << " ";
	}
	for (int i = 0; i < aa3.getLen(); i++)
	{
		cout << aa3[i] << " ";
	}
	//调用外类实现数组存放
	Man man("李下滑", 23);
	Man man1("如花", 23);
	cout << man << endl;
	Vector<Man*> manM(2);
	manM[0] = &man;
	manM[1] = &man1;
	for (int i = 0; i < manM.getLen(); i++)
	{
		cout<<*manM[i];
	}
	return 0;
}

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

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

相关文章

中仕教育:应届生可以考军队文职吗?有什么要求?

军队文职&#xff0c;涵盖了各个领域&#xff0c;包括行政、管理、人力资源、后勤等工作岗位&#xff0c;作为国家公务员的一种类型&#xff0c;军队文职同样享有稳定的工作和待遇。 虽然军队文职对所有符合条件的人开放&#xff0c;但对于应届生来说&#xff0c;还需满足以下…

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

Spring:StopWatch

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、输出总耗时 二、输出所有任务的耗时和占比 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、输出总耗时 public void stopWatc…

【web 编程技术】基于 B/S 架构的电商平台(java web)

基于 B/S 架构的电商平台&#xff08;java web&#xff09; 课程设计实验目的课程设计实验环境课程设计功能概述课程设计需求分析三层架构图功能列表系统用例图系统活动图-用户端需求分析 课程设计详细设计实现过程数据库BaseServlet 的实现商品显示模块-分页显示所有商品、查看…

【网站项目】基于SSM的274办公自动化管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

安全防御-基础认知

目录 安全风险能见度不足&#xff1a; 常见的网络安全术语 &#xff1a; 常见安全风险 网络的基本攻击模式&#xff1a; 病毒分类&#xff1a; 病毒的特征&#xff1a; 常见病毒&#xff1a; 信息安全的五要素&#xff1a; 信息安全的五要素案例 网络空间&#xff1a…

flutter项目怎么判断是不是web平台?Unsupported operation: Platform._operatingSystem

如果你使用Platform 这个工具来判断的时候&#xff0c;很有可能会报错&#xff1a; Exception caught by widgets library The following UnsupportedError was thrown building MyApp(dirty): Unsupported operation: Platform._operatingSystem The relevant error-causin…

关于索引的最常见的十道面试题

面试题一&#xff1a;索引底层如何实现的&#xff1f; MySQL索引的底层实现是取决于存储引擎的&#xff0c;但是是大部分存储引擎底层都是通过B树实现的&#xff0c;以默认的存储InnoDB为例&#xff0c;底层就是通过B树实现的&#xff0c;如下图所示&#xff1a; B树是一种自平…

为什么C++17要引入std::string_view?

目录 1.引言 2.原理分析 2.1.结构 2.2.构造函数 2.3.成员函数 2.4.std::string_view字面量 3.实例 3.1.std::string_view和std::string的运算符操作 3.2.查找函数使用 3.3.std::string_view和临时字符串 4.总结 1.引言 在C/C日常编程中&#xff0c;我们常进行数据的…

elastic search入门

参考1&#xff1a;Elastic Search 入门 - 知乎 参考2&#xff1a;Ubuntu上安装ElasticSearch_ubuntu elasticsearch-CSDN博客 1、ElasticSearch安装 1.1安装JDK&#xff0c;省略&#xff0c;之前已安装过 1.2创建ES用户 创建用户&#xff1a;sudo useradd esuser 设置密码&…

多线程编程1

一、线程的引入 上节&#xff0c;我们介绍了进程的概念&#xff0c;以及操作系统内核是如何管理进程的&#xff08;描述组织&#xff09;&#xff0c;PCB中的核心属性有哪些&#xff0c; 引入进程这个概念&#xff0c;最主要的目的&#xff0c;就是为了解决“并发编程”这样的…

机器学习周记(第二十六周:文献阅读-DPGCN)2024.1.15~2024.1.21

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文摘要 1.3 论文背景 2 论文模型 2.1 问题描述 2.2 论文模型 2.2.1 时间感知离散图结构估计&#xff08;Time-aware Discrete Graph Structure Estimation Module&#xff0c;TADG Module&#xff09; 2.2.2 时间…

【Linux】grub命令行引导进入系统

文章目录 1.grub命令行界面2.设置启动目录3.chainloader加载windows启动文件4.启动5.grub命令行无响应办法 在卸载Linux系统后&#xff0c;有的小白可能会忘记删除Linux的EFI引导。这样的话&#xff0c;下次开机时就会自动进入grub的命令行&#xff0c;连windows系统都进不去了…

C++入门学习(八)sizeof关键字

sizeof 是 C 和 C 中的一个运算符&#xff0c;用于确定特定类型或对象的内存大小&#xff08;以字节为单位&#xff09;。 1、查看数据类型占据内存大小 #include <iostream> using namespace std; int main() {short a 1;int b 1;long c 1;long long d 1;cout<…

Dubbo 的心脏:理解和应用多种协议【十三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Dubbo 的心脏&#xff1a;理解和应用多种协议【十三】 前言<dubbo:protocol> 基础<dubbo:protocol> 的定义和作用微服务中协议的重要性支持的协议类型配置示例 配置基本配置参数高级配置选…

配置DNS主从服务器,实现真反向解析

主服务器 [rootbogon ~]# systemctl stop firewalld.service #关闭防火墙 [rootbogon ~]# setenforce 0 #关闭selinux [rootbogon ~]# systemctl restart named #启动dns服务 [rootbogon ~]# vim /etc/named.conf #进入dns配置文件 options {#监听…

2024年开年的荣誉--来自国产数据库

上周在北京参加了阿里云的开发者大会&#xff0c;我因为去年做了一点小贡献。非常荣幸的获得了阿里云的MVP的这个殊荣。&#xff08;期间也认识了一些大神级的人物&#xff09;还有就是一些网上认识的打卡们线下见面。 这个也是我一直追求的荣誉。 几乎在同时P&#xff08;Ping…

力扣hot100 找到字符串中所有字母异位词 滑动窗口 双指针 一题双解

Problem: 438. 找到字符串中所有字母异位词 文章目录 思路滑动窗口 数组滑动窗口 双指针 思路 &#x1f469;‍&#x1f3eb; 参考题解 滑动窗口 数组 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution { // 滑动窗口 …

基于STM32CubeMX创建FreeRTOS—以STM32F429为例

目录 1. 实验任务 2. 使用STM32CubeMX创建基础工程 2.1 打开STM32CubeMX 2.2 创建新项目 2.3 时钟设置 2.5 修改时钟基准&#xff0c;打开串行调试 2.6 配置串口 2.7 配置状态指示灯 2.8 FreeRTOS 2.9 配置工程输出项 3. 代码编辑 3.1 printf重映射 3.1.1 使用ARM…

资产及价值导入

文章目录 1 Introduction2 Code3 Summary 1 Introduction We will implement the following fuction for importing asset value . In the code we introduce that how to transfer value for BAPI. 2 Code DATA: key TYPE bapi1022_key,generaldata …