`

类模板 示例代码

 
阅读更多
#ifndef ARRAY_CLASS
#define ARRAY_CLASS
#include <iostream>
#include <stdlib.h>
//数组类模板
template <class TA>
class Array
{
public:
	Array(int sz = 50);   //构造函数
	Array(const Array<TA>& A);   //拷贝构造函数
	~Array(void);   //析构函数
					//重载下标符"[ ]",使Array对象可以起到C++普通数组的作用
	TA& operator[ ](int i);
private:
	TA*  a;  //TA类型指针,用于存放动态分配的数组内存首地址
	int size;   //数组大小(元素个数)
};
//以下为类成员函数的实现
// 构造函数
template <class TA>
Array<TA>::Array(int sz)
{
	size = sz;   // 将元素个数赋值给变量size
	a = new TA[size];    //动态分配size个TA类型的元素空间
}
// 析构函数
template <class TA>
Array<TA>::~Array(void)
{
	delete[] a;
}
// 拷贝构造函数
template <class TA>
Array<TA>::Array(const Array<TA>& X)
{
	//从对象X取得数组大小,并赋值给当前对象的成员
	int n = X.size;
	size = n;
	//为对象申请内存并进行出错检查
	a = new TA[n];    // 动态分配n个TA类型的元素空间
					  // 从对象X复制数组元素到本对象  
	TA* src = X.a;    // X.a是对象X的数组首地址
	TA* dest = a;     // a是本对象中的数组首地址
	while (n--)             // 逐个复制数组元素
		*dest++ = *src++;
}
// 重载下标操作符,实现与普通数组一样通过下标访问元素,并且具有越界检查功能
template <class TA>
TA& Array<TA>::operator[ ] (int n)
{
	// 检查下标是否越界
	if (n < 0 || n > size - 1)
	{
		cout << n << " is out_of_bound.\n";
		exit(1);
	}
	return a[n];   // 返回下标为n的数组元素
}
#endif  // ARRAY_CLASS
#pragma once





#include <iostream>
#include <stdlib.h>
#include "array.h"
using std::cout;
using std::endl;
int main()
{
	int i;
	//数组类模板Array实例化为int 型模板类,创建整型数组
	Array<int> intarr1(10);
	for (i = 0; i<10; i++)
		intarr1[i] = i + 3;   //数组元素作左值
	cout << "int array1:";
	for (i = 0; i<10; i++)
		cout << intarr1[i] << " ";  //返回元素值
	cout << endl;
	//数组类模板Array实例化为float型模板类,创建实型数组
	Array<double> douarr(8);
	for (i = 0; i<8; i++)
		douarr[i] = (double)(i + 1)*3.14;
	cout << "double array:";
	for (i = 0; i<8; i++)
		cout << douarr[i] << " ";
	cout << endl;
	//数组类模板Array实例化为int 型模板类,利用数组intarr1拷贝生成整型数组intarr2
	Array<int> intarr2(intarr1);
	cout << "int array2:";
	for (i = 0; i<10; i++)
		cout << intarr2[i] << " ";
	cout << endl;
	//下标越界检查
	intarr1[20] = 100;
	return 0;
}




/*类模板静态成员示例*/
#include <iostream>
using std::cout;
using std::endl;
template <class T>
class ClassA
{
public:
	T getValue()
	{
		return a;
	}
	void setValue(T val)
	{
		a = val;
	}
private:
	static T a;  //类模板静态成员a
};
int ClassA < int > ::a = 100;    //类模板静态成员a的初始化
char ClassA < char > ::a = 'Z';  //类模板静态成员a的初始化
int main()
{
	ClassA< int > ObjectInt1, ObjectInt2;
	ClassA< char > ObjectChar1, ObjectChar2;
	ObjectInt1.setValue(200);
	cout << ObjectInt2.getValue() << " , " << ObjectChar2.getValue();
	cout << endl;
	ObjectChar1.setValue('X');
	cout << ObjectInt2.getValue() << " , " << ObjectChar2.getValue();
	cout << endl;
	return 0;
}



/* 一个通用数组类模板友元的实例  */

/* 模板类的友元函数分为:约束(bound)友元函数 和 非约束(unbound)友元函数*/

#include <iostream>

using std::cout;
using std::endl;

template <typename T> class Array;
template <typename T> void Print(Array <T> & myarr);
template<class T1, class T2>
void ItoF (Array <T1> &Iarr, Array <T2> &Carr);


template <class T>
class Array    //通用数组类模板定义
{
public:
	Array(int s)   // 构造函数
	{
		size = s;
		elem = new T[size];    //分配数组空间
	}
	Array()
	{
		delete[]elem;
	}
	T& operator[] (int index)    //下标运算符[]重载函数
	{
		return elem[index];
	}
	// 未实例化友元函数模板声明
	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	friend void Print<>(Array <T> & myarr);
	// 实例化的友元函数模板声明
	friend void ItoF<>(Array <int> &Iarr, Array <char> &Carr);
private:
	T* elem;
	int size;
};
// 未实例化友元函数模板定义
template<class T>
void Print (Array <T> &myarr)
{
	for (int i = 0; i < myarr.size; i++)
		cout << myarr.elem[i] << "  ";
}
//void Print(Array <char> &myarr)
//{
//	for (int i = 0; i < myarr.size; i++)
//		cout << myarr.elem[i] << "  ";
//}
// 实例化的友元函数模板定义
template<class T1, class T2>
void ItoF (Array <T1> &Iarr, Array <T2> &Carr)
{
	Carr.size = Iarr.size;
	for (int i = 0; i < Iarr.size; i++)
		//强制类型转换,将T1类型的数组元素转换成为T2类型数组元素
		Carr.elem[i] = T2(Iarr.elem[i]);
}
int main()
{
	Array< int > arri(10);  // 生成 int类型模板类和创建int类型数组对象
	Array< char > arrc(10); // 生成 char类型模板类和创建char类型数组对象
	for (int i = 0; i < 10; i++)
		arri[i] = i + 65;
	Print(arri);  cout << endl;
	ItoF(arri, arrc);
	Print(arrc);  cout << endl;
	return 0;
}





// manyfrnd.cpp -- unbound template friend to a template class
#include <iostream>
using std::cout;
using std::endl;

template <typename T>
class ManyFriend
{
private:
    T item;
public:
    ManyFriend(const T & i) : item(i) {}
    template <typename C, typename D> friend void show2(C &, D &);
};

template <typename C, typename D> void show2(C & c, D & d)
{
    cout << c.item << ", " << d.item << endl;
}

int main()
{
    ManyFriend<int> hfi1(10);
    ManyFriend<int> hfi2(20);
    ManyFriend<double> hfdb(10.5);
    cout << "hfi1, hfi2: ";
    show2(hfi1, hfi2);
    cout << "hfdb, hfi2: ";
    show2(hfdb, hfi2);
    // std::cin.get();
    return 0;
}


分享到:
评论

相关推荐

    模板方法模式代码示例

    3. 提高代码复用:公共部分的代码在抽象类中实现,避免重复编写。 在实际应用中,模板方法模式常用于框架设计,例如UI框架的事件处理、数据访问对象(DAO)的增删改查操作等。通过提供一个基础的执行流程,并允许...

    Bootstrap模板示例代码.rar

    附件是一个简单的Bootstrap模板示例代码,它展示了一个基本的网页结构,包括导航栏、一个带有标题和段落的容器以及一个简单的脚注。 这段代码使用了Bootstrap 5的样式和组件。它包括: 一个响应式的导航栏,带有...

    C++入门学习——模板示例代码

    在C++编程语言中,模板是一种强大的特性,它允许我们编写通用代码,以处理不同类型的对象,无需重复编写相似的代码。本篇文章将深入探讨C++模板的基本概念、类型和函数模板,以及模板特化和元编程等高级主题。 首先...

    前端插件art-template模板引擎art-template-test示例代码

    本文主要围绕`art-template`这一前端模板引擎,通过`art-template-test`示例代码来深入探讨其核心概念、使用方法以及在实际项目中的应用。 `art-template`是一个轻量级、高性能的JavaScript模板引擎,它旨在解决...

    ComplicatedTemplate.rar自定义复杂模板示例代码

    本示例代码“ComplicatedTemplate.rar”着重于WPF中的自定义复杂模板,这是一个关键功能,允许开发者根据需求创建独特且复杂的用户界面元素。 在WPF中,模板主要用于定义UI元素的外观。有两类模板:数据模板...

    word文档生成html模板(freemarker)再转为pdf示例代码

    3、示例有本地模板和远程模板之分,可杜绝pdf标题丢失的问题; 4、资源概要:先阅读README.md文档,然后根据文档中的资源示例运行代码,有postman和内部调用两种方式; 5、项目目录other/下面有示例文件可快速入手; ...

    java实现微信公众平台发送模板消息的示例代码

    主要介绍了java实现微信公众平台发送模板消息的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    C++模板示例

    下面是一个简单的函数模板示例,用于交换两个变量的值: ```cpp template void swap(T& a, T& b) { T temp = a; a = b; b = temp; } ``` 这个模板可以处理`int`、`float`、`double`甚至是自定义数据类型。 **...

    软件秘籍示例代码

    示例代码会展示如何创建代理类并让它代替原始对象执行操作。 6. 建造者模式:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在代码中,你会看到如何构建一个建造者接口和各种具体建造者,...

    Vue3+vite搭建基础架构示例代码

    内容概要:Vue3+vite搭建基础架构示例代码。通过该代码示例熟悉vue3写法,以及熟悉router、i18n语言、store全局属性使用、styles全局样式、utils工具类使用、component组件使用、layout通用基础架构设计、以及依赖...

    SpringBoot中整合Mail实现发送模板邮件示例代码

    // 获取用户实体的示例代码,实际应用中应从数据库或其他地方获取 private User getUser() { return new User("John Doe", "john.doe@example.com"); } } ``` 至此,你已经成功地在Spring Boot中集成了邮件服务...

    c++函数模板和类模板计实验报告

    C++中的函数模板和类模板是泛型编程的重要组成部分,它们允许我们编写更为通用的代码,从而能够处理不同数据类型的对象。在这个实验报告中,我们将深入理解这些概念,并通过具体的编程实践来掌握它们。 首先,我们...

    vc++深入详解__示例代码及课件

    《VC++深入详解》是一本专注于讲解Microsoft Visual C++(简称VC++)编程技术的书籍,结合了示例代码和课件,旨在帮助读者全面掌握并深入理解VC++的各个方面。该资源包包含了丰富的实例代码,是学习和提升VC++编程...

    itextsharp示例代码

    示例代码0301至0304可能涵盖创建和填充表格,` PdfPTable`类用于创建表格,`Cell`类用于定义单元格。 ```csharp PdfPTable table = new PdfPTable(3); // 3列 table.AddCell("Column 1"); table.AddCell("Column 2...

    java示例代码

    "示例代码"可能涵盖以上提到的任意或所有概念,每个示例通常会包含完整的类定义、方法实现、主函数(main method)以及必要的注释,以解释代码的功能和工作原理。通过学习和实践这些示例,开发者能够快速掌握Java...

    Vue v-for computed 生命周期和模板引用 语法示例演示代码

    Vue v-for computed 生命周期和模板引用 语法示例演示代码Vue v-for computed 生命周期和模板引用 语法示例演示代码Vue v-for computed 生命周期和模板引用 语法示例演示代码Vue v-for computed 生命周期和模板引用 ...

    Java示例代码

    "Java示例代码"通常指的是为了教学、演示或测试特定功能而编写的简短Java程序。这些代码片段可以帮助开发者理解Java语法、类库以及编程概念。 在Java编程中,一些重要的知识点包括: 1. **基础语法**:Java的基础...

    c++模板元编程代码

    C++模板元编程是一种在编译时执行计算和创建代码的技术,它利用了C++模板系统的能力,将编程任务从运行时转移到了编译时...压缩包中的代码示例提供了实践这一技术的机会,对于学习和掌握模板元编程有着宝贵的参考价值。

    C++函数模板以及类模板简单示例demo

    对C++函数模板的代码实现对C++类模板的代码实现对C++类模板继承的代码实现代码对应的文章:https://blog.csdn.net/ChuJian_cao/article/details/134779209

Global site tag (gtag.js) - Google Analytics