【C++】原型模式
2015-10-12 12:31
477 查看
本文与《【Java】原型模式》(点击打开链接)是姊妹篇,具体的相关概念在这里就不赘述了。
主要是想说明如何利用C++说明如何实现原型模式。
还是同样采用2013年上半年软件设计师的最后一题作为例子来说明这个问题。唯一的不同,是选用其C++来实现。
题目还是这样一字没变:
现要求实现一个能够自动生成求职简历的程序。简历的基本内容包括求职者的姓名、性别、年龄以及工作经历等。希望每份简历的工作经历有所不同,并尽量减少程序中重复的代码。
现采用原型(Prototype)模式来实现上述要求,得到如图6-1所示的类图:
只是用到C++来实现的话,将会面临如何定义接口与处理指针问题,C++可没有Java自带Cloneable接口给你对接。必须自己定义虚函数来实现,同时,也要自己处理好指针的问题,不如程序编译通过,但就是不停的异常抛出。同时C++里面的实现虚函数从implements变成了冒号,C++声明完一个类后面要补一个分号,这些基本的语法问题就不多说了。
我们的任务还是在主函数搞两份简历A与B,但是B无须初始化,直接抄A的内容,然后就是改变其中的工作经历。
具体代码如下:
#include<iostream>
#include<string>
using namespace std;
class Cloneable{
public:
virtual Cloneable* Clone()=0;//定义Clone接口,根据不同的派生类来实例化对象(实现这个接口、虚函数),也就是在这个虚函数中写语言实现它!
};//这个分号一定要注意,这里不是Java
class WorkExperience:public Cloneable{
private:
string workDate;
string company;
public:
Cloneable* Clone(){
WorkExperience *obj = new WorkExperience();
obj->workDate=this->workDate;
obj->company=this->company;
return obj;
}
//getter setter方法,原题目没有,被省略了。
void setWorkDate(string workDate){
this->workDate = workDate;
}
void setCompany(string company){
this->company=company;
}
string getWorkDate(){
return workDate;
}
string getCompany(){
return company;
}
};
class Resume:public Cloneable{
private:
string name;
string age;
string sex;
WorkExperience* work;
Resume(WorkExperience* work){
this->work=work;
}
public:
Resume(string name){
this->name=name;
work = new WorkExperience();//在Resume中private声明中,新建的workexperience * work需要初始化。否则会出现指针异常,原题目被省略了。
}
void setPersonalInfo(string sex,string age){
this->sex=sex;
this->age=age;
}
void setWorkExperience(string workDate,string company){
work->setWorkDate(workDate);
work->setCompany(company);
}
void getAll(){//用来输出数据的代码,原题目没有,被省略了。
cout<<work->getWorkDate()<<","<<work->getCompany()<<","<<age<<","<<sex<<endl;
}
Cloneable* Clone(){
Resume *obj = new Resume(work);
obj->name=this->name;
obj->age=this->age;
obj->sex=this->sex;
return obj;
}
};
int main(){
Resume *a=new Resume("张三");
a->setPersonalInfo("男","29");
a->setWorkExperience("1998-2000","XXX公司");
a->getAll();
Resume *b=(Resume *)a->Clone();//这里必须通过强制类型转换才能匹配类型,部分参考答案没有强制类型转化是错误的,根本就无法通过编译。
b->setWorkExperience("2001-2006", "YYY公司");
b->getAll();
return 0;
}
运行的结果如下:
可以看到,简历B根本没有初始化,只是完全复制A的东西,同时只是改变了工作简历。证明程序正确。
利用原型模式,减少了B在初始化的时候,又要重新输入姓名、年龄等信息的繁琐步骤。
对比于Java的实现,C++的实现比较难。利用自身的虚函数代替Java的接口,比较难以记忆,但是习惯就好。
主要是想说明如何利用C++说明如何实现原型模式。
还是同样采用2013年上半年软件设计师的最后一题作为例子来说明这个问题。唯一的不同,是选用其C++来实现。
题目还是这样一字没变:
现要求实现一个能够自动生成求职简历的程序。简历的基本内容包括求职者的姓名、性别、年龄以及工作经历等。希望每份简历的工作经历有所不同,并尽量减少程序中重复的代码。
现采用原型(Prototype)模式来实现上述要求,得到如图6-1所示的类图:
只是用到C++来实现的话,将会面临如何定义接口与处理指针问题,C++可没有Java自带Cloneable接口给你对接。必须自己定义虚函数来实现,同时,也要自己处理好指针的问题,不如程序编译通过,但就是不停的异常抛出。同时C++里面的实现虚函数从implements变成了冒号,C++声明完一个类后面要补一个分号,这些基本的语法问题就不多说了。
我们的任务还是在主函数搞两份简历A与B,但是B无须初始化,直接抄A的内容,然后就是改变其中的工作经历。
具体代码如下:
#include<iostream>
#include<string>
using namespace std;
class Cloneable{
public:
virtual Cloneable* Clone()=0;//定义Clone接口,根据不同的派生类来实例化对象(实现这个接口、虚函数),也就是在这个虚函数中写语言实现它!
};//这个分号一定要注意,这里不是Java
class WorkExperience:public Cloneable{
private:
string workDate;
string company;
public:
Cloneable* Clone(){
WorkExperience *obj = new WorkExperience();
obj->workDate=this->workDate;
obj->company=this->company;
return obj;
}
//getter setter方法,原题目没有,被省略了。
void setWorkDate(string workDate){
this->workDate = workDate;
}
void setCompany(string company){
this->company=company;
}
string getWorkDate(){
return workDate;
}
string getCompany(){
return company;
}
};
class Resume:public Cloneable{
private:
string name;
string age;
string sex;
WorkExperience* work;
Resume(WorkExperience* work){
this->work=work;
}
public:
Resume(string name){
this->name=name;
work = new WorkExperience();//在Resume中private声明中,新建的workexperience * work需要初始化。否则会出现指针异常,原题目被省略了。
}
void setPersonalInfo(string sex,string age){
this->sex=sex;
this->age=age;
}
void setWorkExperience(string workDate,string company){
work->setWorkDate(workDate);
work->setCompany(company);
}
void getAll(){//用来输出数据的代码,原题目没有,被省略了。
cout<<work->getWorkDate()<<","<<work->getCompany()<<","<<age<<","<<sex<<endl;
}
Cloneable* Clone(){
Resume *obj = new Resume(work);
obj->name=this->name;
obj->age=this->age;
obj->sex=this->sex;
return obj;
}
};
int main(){
Resume *a=new Resume("张三");
a->setPersonalInfo("男","29");
a->setWorkExperience("1998-2000","XXX公司");
a->getAll();
Resume *b=(Resume *)a->Clone();//这里必须通过强制类型转换才能匹配类型,部分参考答案没有强制类型转化是错误的,根本就无法通过编译。
b->setWorkExperience("2001-2006", "YYY公司");
b->getAll();
return 0;
}
运行的结果如下:
可以看到,简历B根本没有初始化,只是完全复制A的东西,同时只是改变了工作简历。证明程序正确。
利用原型模式,减少了B在初始化的时候,又要重新输入姓名、年龄等信息的繁琐步骤。
对比于Java的实现,C++的实现比较难。利用自身的虚函数代替Java的接口,比较难以记忆,但是习惯就好。
相关文章推荐
- C++STL之Set集合容器
- C++不同编译单元内定义的非局部静态对象的初始化顺序
- c语言实现猜数字游戏
- C++多态
- poco框架库Foundtion部分:字符串处理
- C++ 虚函数表解析
- 用C语言操作MySQL数据库
- MFC中视图分割和视图间消息传递
- 【C++】char*,const char*,string的相互转换
- C语言操作sqlite数据库(增删改查)
- OpenCV C++如何使RGB图像变为灰度图像
- 【C++】查询TXT中是否存在的字符和添加字符
- Duanxx的Design abroad: C++矩阵运算库Eigen 概要
- leetcode 155 Min Stack C++ 24ms solution
- 在安卓JNI/NDK中使用C++11
- C++设计模式(第一周)
- 借助STL实现一些常用的C++的几种字符串处理函数
- 指向函数的指针1(c语言)
- 值得关注的10个C语言开源项目
- iOS学习之---个人总结C语言自学建议!