面向对象程序设计学习报告
1. 程序简介
该程序名为drawcli.exe,是一款由微软公司开发的实现简单功能的绘图软件:具体功能为绘制线条,多边形,圆等基本图形,具有保存和打开文件功能。通过文件目录中的可执行程序进入程序,程序上方有:FILE、EDIT、VIEW、DRAW、OBJECT、WINDOW、HELP五个菜单;下方分别有NEW、OPEN、SAVE、CUT、COPY、PASTE、TOOL、PRINT、ABOUT、HELP等按钮供选择。下方为主要的图形编辑区,可通过新建创立。可以在图新编辑区绘制出直线,圆,椭圆,矩形,多边形等基本图形。对于图形可进行复制粘贴移位删除等操作,也可以改变图形相互之间的叠加顺序。图形编辑完成后可用SAVE按钮或FILE中的SAVE进行用户自定义路径的保存,关闭后便可通过正确的路径打开。程序中的ABOUT,和HELP菜单能够帮助用户了解和使用程序。
2. 程序分析
程序由15个.cpp文件组成,每一个.cpp文件都有一个对应的.h头文件。
(1) 程序中的类的定义以及继承
存在29自定义的新类,所有的类的定义均在头文件中完成。大部分的类的定义中都用到了两种或以上的访问限制符。如class CDrawDoc类中则用到了public和protect两种访问限制符。每
个类中大都定义了一定数量的构造函数,包含各种类型的构造函数。如类class CProperty中含有:CProperty(void) 函数和CProperty( DWORD dwID, const LPVOID pValue, DWORD dwType)函数类class CRectDlg中含有的构造函数。
CRectDlg(CWnd* pParent = NULL);前两个函数中前者是无参构造函数,后者则为一般构造函数,第三个构造函数为复制构造函数。与构造函数相对的,类中必然定义了与此类相应的析构函数,用于撤销该类,如class CDrawView中的函数virtual ~CDrawView()则为其对应的析构函数。类中还含有大量的一般成员函数,主要执行访问本累数据成员以及完成本类主要功能的作用。如class CDrawView类中的 void Select(CDrawObj* pObj, BOOL bAdd = FALSE); class CDrawDoc中的CDrawObjList* GetObjects() { return &m_objects; }等一些函数即是一般成员函数。其中CDrawObjList* GetObjects()函数的主要功能为返回一个地址值。关于this指针的运用,程序中主要将其进行隐式调用,一般在运算符重载,调用成员函数时用到。C++中的静态成员在此程序中亦有用到,如类class CDrawOleObj中的static BOOL c_bShowItems;则为静态数据成员。c++中用于建立类与类之间联系,提高程序执行效率,降低程序中消息在类与类之间传递而带来的开销的友元,包括友元函数和友元类在此程序中有运用,如类class COleDataSource中的friend class COleServerItem;即为友元类。
类的继承作为函数的主体部分,大多数为public继承方式,即公有继承方式。如类class AFX_NOVTABLE COleServerItem的定义则公有继承了类CDocItem,此程序中大都为public式继承,private继承和protect继承在此程序中较少运用。在定义完派生类后,按照一般的类的规则,需要编写对类中数据成员初始化的构造函数和撤销类时释放内存的析构函数,如类class CDrawPoly中就含有函数CDrawPoly()作为其构造函数,有virtual ~CDrawPoly()虚析构函数作为此类的析构函数。类class CDrawOleObj中也含有函数CDrawOleObj()作为其构造函数,virtual ~CDrawOleObj()作为其析构函数。派生类中的构造函数以及析构函数的类型与定义和运用的方式大致与基类中的构造函数和析构函数相似。不同之处主要在于构造函数中的初始化列表中的参数必须包括基类的初始化的参数。派生类中的一般成员函数定义与基类中相同,初始化方式中亦可以定义默认值或在函数调用时运用实参给形参赋值的方式。对于c++中允许的多继承在此程序运用则较少,大都是单继承的形式呈现在程序中。
(2) 程序中使用的常量的定义
如形如const CRect&rect常量引用的定义,形如void AssertValid() const;的常量函数的定义;而引用变量的使用,主要出现在函数自检传值时,形参的定义,主要为了实现函数自检的地址传输,有利于数据在函数与函数之间的传递。程序中存
在new运算符,即动态分配存储空间的使用,CDrawObj* pClone = new CDrawObj(m_position);语句中即通过new申请了一块CDrawObj类大小的内存空间给与CDrawObj指针,与此相对的,用到delete运算符将所申请的内存空间释放掉。对于作用域运算符::的使用,主要是在对类中已经申明的函数在类外进行定义时用到。如class CDrawDoc类中申明的构造函数CDrawDoc();在另一个头文件中进行定义,其定义形式为CDrawDoc::CDrawDoc()。用于指明CDrawDoc()函数的存在区域。
(3)
首先,在程序中运用到了运算符重载的形式。
如类class CString中的 friend CString AFXAPI operator+?语句中,同样是把“+” 符号进行了重载,不同的是上面是将符号重载为运算符函数,而后面则是把符号重载成为友元函数此两种形式有其各自的特点,重载成运算符函数时,由于有this指针的存在,参数的个数为运算符的目数少一,而重载成为友元函数时,由于友元函数不含this指针,参数表中的参数的数量与所重载的运算符的目数相同;这两种重载方式对与不同运算符有着各自选择,如单目运算符最好选用成员函数的重载方式,而双目运算符最好重载成为友元函数,这是因为有些情况不能重载成成员函数。例如此程序中的“+”符号都为重载成友元函数。
关于虚函数的运用,在此程序中有很多地方有用到。虚函数的运
用,主要为了运用到动态联编。如类class CMainFrame中存在三个虚函数:virtual ~CMainFrame(),virtual void AssertValid() const,virtual void Dump(CDumpContext& dc) const,其中还含有一个虚析构函数。
第二篇:面向对象程序设计实训报告
桂林电子科技大学信息科技学院 《面向对象程序设计》实训报告
学 号 0952100134
姓 名 刘嘉轩
指导教师:韩桂明 李登辉
月日
1
宋体五号字
1.1 功能。
2 所保存的所有记录,最终实现设计要求与任务。
3方案设计
3.1 方案论证
首先,新建工程MFC APPWizard,选择正确路径,以及应选择正确的对话框,然后,提出构想计划对话框进行设计分别设置信息要求如:学号,姓名,语文,数学等以及设置保存,查找,显示全部等功能信息框及编辑输入信息框。
其次,创建数据库,插入类,及建立类向导设定相应的信息等,通过上网及书籍查询相应的程序,定义包含头文件,书写函数及修改程序,编写代码,定义字符串定义类等繁琐工作,通过学习与应用VC++知识实现最终功能。
最后,通过分部编译进行调试程序,验证相应的功能,能否正常运行,实现设计要求与任务。当出现错误时,应及时修改及向老师及同学请教
3.2 工作原理
4软件设计
5 制作与调试过程
// jiaxuanDlg.cpp : implementation file
//
#include "stdafx.h" //包含头文件
#include "jiaxuan.h"
#include "jiaxuanDlg.h"
#include "data.h"
#include "afxdb.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////
//////////////////
// CJiaxuanDlg dialog
CJiaxuanDlg::CJiaxuanDlg(CWnd* pParent /*=NULL*/)
: CDialog(CJiaxuanDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CJiaxuanDlg)
m_xuehao = _T("");
m_xingming = _T("");
m_yuwen = _T("");
m_shuxue = _T("");
m_cz_xuehao = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CJiaxuanDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CJiaxuanDlg)
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_Text(pDX, IDC_EDIT1, m_xuehao);
DDX_Text(pDX, IDC_EDIT2, m_xingming);
DDX_Text(pDX, IDC_EDIT3, m_yuwen);
DDX_Text(pDX, IDC_EDIT4, m_shuxue);
DDX_Text(pDX, IDC_EDIT5, m_cz_xuehao);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CJiaxuanDlg, CDialog)
//{{AFX_MSG_MAP(CJiaxuanDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, Onbaocun)
ON_BN_CLICKED(IDC_BUTTON2, Onchazhao)
ON_BN_CLICKED(IDC_BUTTON3, Onxianshi)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CJiaxuanDlg message handlers
BOOL CJiaxuanDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_list.InsertColumn(0,"学号");
m_list.InsertColumn(1,"姓名");
m_list.InsertColumn(2,"语文");
m_list.InsertColumn(3,"数学");
m_list.SetColumnWidth(0,50);
m_list.SetColumnWidth(1,50);
m_list.SetColumnWidth(2,50);
m_list.SetColumnWidth(3,50);
m_list.SetColumnWidth(4,50);
m_list.SetColumnWidth(5,50);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CJiaxuanDlg::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CJiaxuanDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CJiaxuanDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CJiaxuanDlg::Onbaocun()
{
data m_file;
CString s;
s.Format("select * from shuju");//调用数据库
if(!m_file.Open(AFX_DB_USE_DEFAULT_TYPE,s))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK); return ;
}
UpdateData(); //更新列表
m_file.MoveFirst;
m_file.AddNew();
m_file.m_xh=m_xuehao;
m_file.m_xm=m_xingming;
m_file.m_yw=m_yuwen;
m_file.m_sx=m_shuxue;
m_file.Update();
m_file.Close();
AfxMessageBox("添加信息成功!");
return;
}
void CJiaxuanDlg::Onchazhao()
{
data m_sjk;//定义对象
UpdateData();
CString str;//定义字符串
if(m_cz_xuehao=="")
{
MessageBox("学号输入不能为空");
}
if(!m_cz_xuehao.IsEmpty())
{
str.Format("select * from shuju where xh m_cz_xuehao);//输入信息与数据库信息相比较 }
m_list.DeleteAllItems();
m_list.SetRedraw(FALSE); //重置
if(!m_sjk.Open(AFX_DB_USE_DEFAULT_TYPE,str)) {
MessageBox("打开数据库失败!"); = '%s' ",
return ;
}
int i=0;
while(!m_sjk.IsEOF())
{
m_list.InsertItem(i,m_sjk.m_xh);
m_list.SetItemText(i,1,m_sjk.m_xm); m_list.SetItemText(i,2,m_sjk.m_yw); m_list.SetItemText(i,3,m_sjk.m_sx);
i++;
m_sjk.MoveNext();
}
m_sjk.Close();
m_list.SetRedraw(TRUE);
}
void CJiaxuanDlg::Onxianshi()
{ data m_sj;//定义对象
m_list.DeleteAllItems();
m_list.SetRedraw(FALSE);
UpdateData(TRUE);
CString m_chuan;
m_chuan.Format( "select * from shuju");
if(!m_sj.Open(AFX_DB_USE_DEFAULT_TYPE,m_chuan)) {
MessageBox("打开数据库失败!");
return ;
}
int i=0;
while(!m_sj.IsEOF())
{
m_list.InsertItem(i,m_sj.m_xh);
m_list.SetItemText(i,1,m_sj.m_xm);
m_list.SetItemText(i,2,m_sj.m_yw);
m_list.SetItemText(i,3,m_sj.m_sx);
i++;
m_sj.MoveNext();
}
m_sj.Close();
m_list.SetRedraw(TRUE);
}
6 实训心得体会
通过本次学习面向对象程序设计,成绩统计系统实训,通过对C++的学习,掌握基本的编程方法,利用课程设计的机会掌握在理论课堂上不便掌握的技能,学到了很多知识,增强了个人的动手能力,熟悉了C++软件的具体应用,也学到了不少的新知识,在遇到问题是可以借阅相应资料,选择合理的方法解决问题,扩展自身的知识面。懂得如何应用资源,及快速查阅资料,通过一定的时间收集资料,系统设计,编写代码和程序测试,我的实训终于完成了,实现成绩统计系统的显示全部、编辑、查找及保存功能。成绩统计系统初步得到完善与应用,充分发挥自己的创新能力,加强对问题分析和解决的能力。利用已学的基础知识结合实际操作提高自学习能力,设计一个《成绩统计管理》,进一步熟悉面向对象编程中类的概念、类的封装、继承的实现方式,在实训时一边看书,一边写程序,看看是不是书上说的那样。但遇到不解的时候向他人请教,了解系统开发的需求分析、类层次设计、模块分解、编码测试、模块组装与整体调试的全过程,加深对C++的理解与Visual C++环境的使用;逐步熟悉程序设计的方法,并养成了良好的编程习惯。
虽然本次实训已经结束,但是真正的学习才现在开始,因为此次实训也暴漏自己本身的缺点与不足。所以在以后的学习当中依然要努力学习,认真对待,细心编程,谦虚请教。