在百度怎么建立自己的网站吗,达州建设网站,横沥东莞网站建设,深圳建筑业网站建设C —— 模板类扩展 模板类的成员模板将模板类用作参数 模板类的成员模板
结构体中可以有结构体#xff0c;类中可以有类和成员函数。那么#xff0c;模板类中也应该可以有模板类和模板函数。 在类AA中再创建一个模板类和模板函数。 先创建模板类#xff0c;代码如下#x… C —— 模板类扩展 模板类的成员模板将模板类用作参数 模板类的成员模板
结构体中可以有结构体类中可以有类和成员函数。那么模板类中也应该可以有模板类和模板函数。 在类AA中再创建一个模板类和模板函数。 先创建模板类代码如下
#include iostream
using namespace std;template class T1, class T2
class AA {
public: T1 m_x;T2 m_y;AA(const T1 x, const T2 y): m_x(x), m_y(y) {}void show() {cout AA的show ~ m_x m_x , m_y m_y endl;}template class Tclass BB{public:T m_b;// 可以用AA的模板参数T1、T2创建成员变量T1 m_bx;BB() {}void show() {cout BB的show ~ m_b m_b , m_bx m_bx endl;}};BBstring bb; // 对象bb就是类模板AA的成员template typename T // 再创建一个函数模板这个T和BB中的T没有关系void show(T t) {cout 模板函数show ~ t t endl;cout AA ~ m_x m_x , m_y m_y endl;bb.show();}
};int main() {AAint, string aa(123, 你好);aa.show();aa.bb.m_b 哈哈;aa.bb.m_bx 666;aa.bb.show();aa.showstring (嘻嘻嘻);return 0;
}运行结果如下 AA的show ~ m_x 123, m_y 你好 BB的show ~ m_b 哈哈, m_bx 666 模板函数show ~ t 嘻嘻嘻 AA ~ m_x 123, m_y 你好 BB的show ~ m_b 哈哈, m_bx 666 模板类中的成员模板定义可以写在类的外面。修改后的代码如下
#include iostream
using namespace std;template class T1, class T2
class AA {
public: T1 m_x;T2 m_y;AA(const T1 x, const T2 y): m_x(x), m_y(y) {}void show() {cout AA的show ~ m_x m_x , m_y m_y endl;}template class Tclass BB{public:T m_b;// 可以用AA的模板参数T1、T2创建成员变量T1 m_bx;BB() {}void show();};BBstring bb; // 对象bb就是类模板AA的成员template typename T // 再创建一个函数模板这个T和BB中的T没有关系void show(T t);
};// 模板类中的成员模板定义可以写在类的外面。
template class T1, class T2
template class T
void AAT1, T2::BBT::show() {{cout BB的show ~ m_b m_b , m_bx m_bx endl;}
}template class T1, class T2
template typename T
void AAT1, T2::show(T t) {cout 模板函数show ~ t t endl;cout AA ~ m_x m_x , m_y m_y endl;bb.show();
}int main() {AAint, string aa(123, 你好);aa.show();aa.bb.m_b 哈哈;aa.bb.m_bx 666;aa.bb.show();aa.showstring (嘻嘻嘻);return 0;
}运行结果跟之前保持一致 AA的show ~ m_x 123, m_y 你好 BB的show ~ m_b 哈哈, m_bx 666 模板函数show ~ t 嘻嘻嘻 AA ~ m_x 123, m_y 你好 BB的show ~ m_b 哈哈, m_bx 666 将模板类用作参数
C的类模板主要是为了解决数据结构的问题。线性表有链表、数组、栈、和队列。以链表和数组为例为了支持任意类型数据最好的方法就是用类模板来实现代码如下
#include iostream
using namespace std;template class T, int len // 实际上链表没有长度的说法但为了演示假定有一个长度
class LinkList {
public:T* m_head; // 定义链表头节点指针int m_len len; // 指定表长度// 链表常用操作void insert() {cout LinkList 插入操作 endl;}void ddelete() {cout LinkList 删除操作 endl;}void update() {cout LinkList 更新操作 endl;}
};template class T, int len
class Array{
public:T* m_data;int m_len len;void insert() {cout Array 插入操作 endl;}void ddelete() {cout Array 删除操作 endl;}void update() {cout Array 更新操作 endl;}
};int main() {return 0;
}模板的目的就是代码重用既然链表和数组的逻辑结构是一样的那就把它们改成模板类的形式。目前模板LinkList和Array是为了兼容各种各样的数据类型解决的是物理结构问题。接下来把它们再次模板化是从逻辑角度来考虑的。C支持模板的模板意思是把模板名当成一种特殊的数据类型。实例化对象的时候可以用模板签名作为参数传给模板。示例代码如下
#include iostream
using namespace std;template class T, int len // 实际上链表没有长度的说法但为了演示假定有一个长度
class LinkList {
public:T* m_head; // 定义链表头节点指针int m_len len; // 指定表长度// 链表常用操作void insert() {cout LinkList 插入操作 endl;}void ddelete() {cout LinkList 删除操作 endl;}void update() {cout LinkList 更新操作 endl;}
};template class T, int len
class Array{
public:T* m_data;int m_len len;void insert() {cout Array 插入操作 endl;}void ddelete() {cout Array 删除操作 endl;}void update() {cout Array 更新操作 endl;}
};// 线性表模板类其中tabletype 表示 线性表类型datatype 表示 线性表数据类型len 表示 长度
// tabletype 不是一个普通的参数而是模板意思是这个参数要填模板名。
// 填什么样的模板名呢填有两个参数的类模板名。并且要求类模板的第一个参数是通用类型第二个是非通用类型。
// 此外class可以用typename代替只是class更直观。
// tabletype只是一个模板名用T1创建对象时还需要指定具体的数据类型。
// 常见的做法是具体的数据类型用模板参数从外面传进来
templatetemplateclass, intclass tabletype, class datatype, int len // 模板参数列表
class LinearList{
public:tabletypedatatype, len m_table; // 创建线性表对象void insert() {m_table.insert();}void ddelete() {m_table.ddelete();}void update() {m_table.update();}
};int main() {// 创建线性表对象容器类型为链表链表的数据类型为int链表长度为20LinearListLinkList, int, 20 a;a.insert();a.ddelete();a.update();LinearListArray, string, 20 b;b.insert();b.ddelete();b.update();return 0;
}运行结果如下 LinkList 插入操作 LinkList 删除操作 LinkList 更新操作 Array 插入操作 Array 删除操作 Array 更新操作 感谢浏览一起学习