跟我一起透彻理解template模板模式
2015-06-30 14:53
465 查看
#include <iostream> using namespace std; //template模式。 class Base { public: void DealWhat() { this->Printf1(); this->Printf2(); } protected: virtual void Printf1() = 0; virtual void Printf2() = 0;//让子类实现算法的具体实现。 }; class Son1 : public Base { public: void Printf1() { cout << "Son1::Printf1()" << endl; } void Printf2() { cout << "Son1::Printf2()" << endl; } }; class Son2 : public Base { public: void Printf1() { cout << "Son2::Printf1()" << endl; } void Printf2() { cout << "Son2::Printf2()" << endl; } }; int main() { Base *b = new Son2(); b->DealWhat(); return 0; }
感悟:
基类的方法由不同子类去具体实现,我们需要什么具体的算法
或者算法,直接构造相关的子类就可以使用,但是公共接口还
是定义在基类中,这样方便所有的子类都可以利用C++多态机制进行覆盖改写。
下面是我的具体事例详解:
#include <iostream> using namespace std; //template模式。 class Base { public: Base(int a[],int n) { data = new int ; int i = 0; for (; i < n; i++) { data[i] = a[i]; } size = n; } void Printf() { int i = 0; for (; i < size; i++) { cout << data[i] << " "; } cout << endl; } void DoWhat() { this->sort(); //算法的具体实现交给不同的子类来实现,我们通过共有的接口来调用。 } protected: virtual void sort() = 0;//排序方法的实现。 int *data; int size; }; class Bubble : public Base//冒泡排序。 { public: Bubble(int a[], int n) :Base(a, n){} void sort() { int i = 0; int temp; for (; i < size; i++) { for (int j = 0; j<(size-i-1); j++) { if (data[j+1]<data[j]) { temp = data[j]; data[j] = data[j+1]; data[j+1] = temp; } } } } }; class Insert : public Base//插入排序。 { public: Insert(int a[], int n) :Base(a, n){} void sort() { int i = 0; int j; int k; int temp; for (; i < size; i++) { j = i; temp = data[i]; for (k = 0; k <= i; k++) { if (data[k]>temp) { break; } } for (; j > k; j--) { data[j] = data[j - 1]; } data[j] = temp; } } }; class Qulick : public Base//快速排序。 { public: Qulick(int a[], int n) :Base(a, n){} void sort() { sort(data,0,size); } private: void sort(int a[], int low, int high) { int i = -1; int j = 0; if ( low>=high )return; int key = data[high-1]; int temp; while (j<high) { while (data[j]>key)j++; i++; temp = data[i]; data[i] = data[j]; data[j] = temp; j++; } data[i] = key; sort(a,0,i-1); sort(a,i+1,high); } }; class Select : public Base//选择排序。 { public: Select(int a[], int n) :Base(a, n){} void sort() { int i = 0; int j; int temp; for (; i < size - 1; i++) { for (j = i + 1; j < size; j++) { if (data[i]>data[j]) { temp = data[i]; data[i] = data[j]; data[j] = temp; } } } } }; int main() { int a[] = { 4, 6, 7, 9, 1, 23, 4 }; /*Base *p = new Qulick(a, 7); p->DoWhat(); p->Printf();//插入排序。 */ Base *p = new Bubble(a,7); p->DoWhat(); p->Printf();//冒泡排序。 return 0; }
相关文章推荐
- Android 监听EdText的变化,过滤显示数据
- OGRE在渲染通路中使用顶点程序和片断程序
- JS合并的必要性分析
- struts2 文件下载(修正中文问题)
- Hello,world!
- 使用Eclipse构建Maven项目 (step-by-step)
- linux 硬盘分区,分区,删除分区,格式化,挂载,卸载笔记
- SWF FLASH的param属性和属性的详解
- SQL语句优化
- 织梦dedeCMS|系统基本配置标签
- SWF FLASH的param属性和属性的详解
- 主题切换及其管理
- 作业6.12
- 使用js的ajax方法读取txt文本里面的JSON数据并追加到Html元素节点上
- 数据结构和算法系列 - AVL树
- code::blocks的快捷键汇总
- Ubuntu下安装libtorrent
- NGINX之——配置HTTPS加密反向代理访问–自签CA
- Handler和消息队列学习
- HLSL 变量语法定义