C++实验报告14150.docx
- 文档编号:12096667
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:16
- 大小:165.96KB
C++实验报告14150.docx
《C++实验报告14150.docx》由会员分享,可在线阅读,更多相关《C++实验报告14150.docx(16页珍藏版)》请在冰豆网上搜索。
C++实验报告14150
《面向对象的编程技术》课程设计实验报告
(2012/2013学年第一学期)
姓名:
陈阳
学号:
119074075
班级:
计算机科学与技术113班
指导教师:
胡增涛
2012年12月14日
1.应用程序名称.....................................................................3
2.应用程序的设计目的及意义.............................................3
3.应用程序简介.....................................................................3
设计目的.................................................................3
功能介绍.................................................................3
主要知识点.............................................................3
实验环境......................................................................4
4.应用程序的设计........................................................................4
类层次图......................................................................4
程序实现思路..............................................................5
程序运行界面介绍......................................................6
五.心得体会.....................................................................................7
附录....................................................................................................8
源代码........................................................................................8
一.应用程序名称
水果工厂的实现
二.设计目的及意义
学会综合运用C++教材中的基础理论知识,并学习专业编程中广为借鉴的一些经典的编程模式,联系具体事例,解决实际问题,达到深入领会理论,分析解决实际问题,培养一定的编程实践能力的目的。
三.应用程序简介
设计目的
现模拟一个水果工厂:
系统中有一个唯一的水果生产工厂,能生产成品水果产品,如苹果、橘子、梨、香蕉等等,生产工厂能根据用户的选择或要求生产指定的水果并提供给客户。
功能简介
系统中有一个水果工厂,能生产苹果(Apple)、橘子(Orange)、梨(Pear)三种水果。
客户在界面的提示下选择自己想要的水果,这时系统中会创建一个唯一的生产工厂,生产出客户要求的水果并提供给客户。
主要知识点
一.Factory模式:
在面向对象系统设计中经常可以遇到以下的两类问题:
为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。
这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。
这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如new×××;的代码。
这里带来两个问题:
1)客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了处理可能的名字冲突,有的命名可能并不是具有很好的可读性和可记忆性,就姑且不论不同程序员千奇百怪的个人偏好了),程序的扩展性和维护变得越来越困难。
2)还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。
这里的意思为:
假设我们在类A中要使用到类B,B是一个抽象父类,在A中并不知道具体要实例化那一个B的子类,但是在类A的子类D中是可以知道的。
在A中我们没有办法直接使用类似于new×××的语句,因为根本就不知道×××是什么。
以上两个问题也就引出了Factory模式的两个最重要的功能:
1)定义创建对象的接口,封装了对象的创建;
2)使得具体化类的工作延迟到了子类中。
Factory设计模式结构图:
2.单例模式:
单例模式(SingletonPattern)又称单件模式,单例模式保证一个类仅有一个实例,并提供一个访问的他的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化单对象,一个最好的办法就是,让类自身负责保存他的唯一实例,这个类可以保证没有其他实例可以被创建并且他可以提供一个访问该实例的方法。
单例模式设计式结构:
Singleton
-instance:
Singleton
+Singleton()
+GetInstance()
Singlenton类,定义了一个GetInstance操作,允许客户访问他的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例。
实验环境
操作系统:
Windows98,WindowsXP,Windows7
开发工具:
VisualC++6.0
4.应用程序的设计
类层次图
Factory
Fruit
<
strin&):
Fruit*
<
#Fruit()
<
void
<
void
<
void
<
ConcreteFactory
Apple
Orange
Pear
<
ConcreteFactory*
#ConcreteFactory()
<
ConcreteFactory*
+CreatFruit(var:
strin&):
Fruit*
+~ConcreteFactory()
+plant():
void
+price():
void
+value():
void
+~Apple()
+plant():
void
+price():
void
+value():
void
+~Orange()
+plant():
void
+price():
void
+value():
void
+~Pear()
程序实现思路
第一步:
创建抽象类Fruit类;
声明保护类成员:
Fruit();
声明公有成员纯虚函数:
virtualvoidplant()=0;
virtualvoidprice()=0;
virtualvoidvalue()=0;
virtual~Fruit()=0;
第二步:
分别创建Fruit的派生类Apple,Orange,Pear;
第三步:
实现Fruit类与Apple,Orange,Pear类;
分别实现各类的构造函数,析构函数,业务函数plant()、value(),price();
第四步:
创建Factory类;
引用头文件string;构造函数声明为protected类;
声明公有纯虚函数:
virtual~Factory()=0;
virtualFruit*CreatFruit(string&var)=0;
第五步:
创建Factory的派生类ConcreteFactory(单例模式);
第六步:
实现Factory与ConcreteFactory类;
第七步:
在main函数中测试类。
程序运行界面介绍
在界面的提示下,输入需要的水果,工厂只生产apple,orange,pear三种。
若客户从输入端输入“apple”,则工厂生产苹果,并传递给客户,在界面上显示苹果的营养价值和价格:
若客户从输入端输入“orange”,则工厂生产橘子,并传递给客户,在界面上显示橘子的营养价值和价格:
若客户从输入端输入“pear”,则工厂生产梨,并传递给客户,在界面上显示梨的营养价值和价格:
若客户选择了其他的水果,则输出“我们工厂不生产这种水果”
五.心得体会
经过这次课程设计,让我发现了自己C++学习上的漏洞,学习到了很多东西,也锻炼了动手编程能力。
通过独立完成水果应用程序的设计与实现,让我体验了完成一项工程的基本步骤,首先,先了解工程要解决的实际问题,在水果工厂工程中,就是要模拟工厂生产客户所需要的水果。
其次,在对工程分析后进行设计,画出整体设计结构图,在设计过程中,要思考局部功能实现的方式。
然后通过自己较扎实的编程基础,写出代码。
为了完成水果工厂应用程序,我通过老师的课件和从网上学习了工厂模式和单例模式,对设计模式有了一些了解,也体会到了设计模式对软件设计的用处,我以后要自主学习,尽量多掌握这些设计模式,我想这对以后的学习和工作都有很大的帮助。
此外,检查和巩固了我对本学期所学的知识。
通过查阅课本、资料、实践,加强了对类以及指针的使用,巩固了相关知识。
特别是虚基类,以前对于虚基类的使用不多,通过这次的实践,让我对其使用更加熟练。
在编程过程中,难免出现难题和错误,在不断解决所遇到的问题中,也提高了我的独立思考能力,分析和解决问题的能力。
通过自己的反复思考、修改调试代码,最后解决问题、运行成功,使我感觉到了很多的喜悦感与自豪感。
通过这次课程设计,使我认识到自己的的动手能力还有待提高,以及自己计算机技术掌握的不够全面。
以后只有多加实践,理论知识与实践相结合,才能提高自己的编程能力。
附录
源代码
//Fruit.h
classFruit{
public:
virtual~Fruit()=0;
virtualvoidplant()=0;
virtualvoidprice()=0;
virtualvoidvalue()=0;
protected:
Fruit();
};
classApple:
publicFruit{
public:
~Apple();
Apple();
voidplant();
voidvalue();
voidprice();
};
classOrange:
publicFruit{
public:
~Orange();
Orange();
voidplant();
voidvalue();
voidprice();
};
classPear:
publicFruit{
public:
~Pear();
Pear();
voidplant();
voidvalue();
voidprice();
};
//Fruit.cpp
#include"Fruit.h"
#include
#include
usingnamespacestd;
Fruit:
:
Fruit(){}
Fruit:
:
~Fruit(){}
Apple:
:
Apple()
{
cout<<"您选择的水果是苹果..."< } Apple: : ~Apple() { } voidApple: : plant() { cout<<"PlantApple"< } voidApple: : value() { cout<<"苹果味道酸甜适中,营养丰富,富含锌、钙、磷、铁、钾等微量元素"< voidApple: : price() { cout<<"苹果的价格是: 4元/斤"< } Orange: : Orange() { cout<<"您选择的水果是橘子..."< } Orange: : ~Orange() { } voidOrange: : plant() { cout<<"PlantOrange"< } voidOrange: : value() { cout<<"橘子色彩鲜艳、酸甜可口,富含蛋白质、有机酸、维生素以及钙、磷、镁、钠等"< } voidOrange: : price() { cout<<"橘子的价格是: 2元/斤"< } Pear: : Pear() { cout<<"您选择的水果是梨..."< } Pear: : ~Pear() { } voidPear: : plant() { cout<<"PlantPear"< } voidPear: : value() { cout<<"梨子味甘微酸,性凉,具有生津止渴、益脾止泻、和胃降逆的功效"< } voidPear: : price() { cout<<"梨的价格是: 3.2元/斤"< } //Factory.h #include usingnamespacestd; classFruit; classFactory { public: virtual~Factory()=0; virtualFruit*CreatFruit(string&var)=0; protected: Factory(); }; classConcreteFactory: publicFactory { public: staticConcreteFactory*Instance(); ~ConcreteFactory(); Fruit*CreatFruit(string&var); protected: ConcreteFactory(); private: staticConcreteFactory*instance; }; //Factory.cpp #include"Factory.h" #include"Fruit.h" #include #include usingnamespacestd; ConcreteFactory*ConcreteFactory: : instance=0; Factory: : Factory(){} Factory: : ~Factory(){} ConcreteFactory: : ConcreteFactory() { cout<<"ConstructorConcreteFactory"< } ConcreteFactory: : ~ConcreteFactory() { cout<<"DestructorConcreteFactory"< } ConcreteFactory*ConcreteFactory: : Instance() { if(instance==0) instance=newConcreteFactory(); returninstance; } Fruit*ConcreteFactory: : CreatFruit(string&var) { if(var=="apple) returnnewApple(); elseif(var=="orange") returnnewOrange(); elseif(var=="pear") returnnewPear(); else returnNULL; } //main.cpp #include"Factory.h" #include"Fruit.h" #include #include usingnamespacestd; intmain() { stringvar; cout<<"欢迎来到水果工厂"< cout<<"--------------------------------"< cout<<"请输入你要的水果: (apple,orange,pear)"< cin>>var; Factory*fac=ConcreteFactory: : Instance(); Fruit*p=fac->CreatFruit(var); if(p) { p->plant(); p->value(); p->price(); } else cout<<"我们不生产这种水果"< deletep; deletefac; return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实验 报告 14150