Skip to content

Latest commit

 

History

History
113 lines (56 loc) · 7.45 KB

6-一些常见的错误.md

File metadata and controls

113 lines (56 loc) · 7.45 KB

第六讲(一些常见的错误)

1. 四个概念的辨别

(形式:屏幕录制浏览器,打开这几个概念的维基百科,边浏览边讲解)

网址:

一些同学在学完 C++,现在来做 MFC应用程序的课程设计,对于 C++,VC++,Visual Studio,MFC 这几个概念就出现了认识混乱,老师在这里有必要给大家辨别一下。

C++:这是一门编程语言,就像其他的编程语言,如长久不衰的 Java,现在最火的 Python,语言对于我们来说只是个表达思想的工具,我们也可以用 C++ 做网站,做软件。

VC++:全称是 Microsoft Visual C++,是微软公司的 C++ 开发工具。

简单的来说,这是一种 C++ 的编译工具,但并不是只有编译功能,还有编辑和除错等功能。

C++ 的源程序 .cpp文件,使用 VC++ 编译工具编译生成目标程序 .obj 文件,最后和 VC++ 中的相关库链接,生成可执行程序 .exe。

C++ 编译器并不止 VC++ 这一种,我们使用的 Vistual Studio 内置的就是 VC++ 编译器。

还有跨平台的 GCC 编译器,这个 Linux 平台用的比较多,Mac 系统下是 Clang 编译器,他们主要是在一些 C++标准的支持上有所不同。

关于这几种编译器的区别,同学们可上网进一步的了解。

Vistual Studio:这是 Windows 平台下常用的 C++ 集成开发环境,简称为 IDE。

它包含了软件开发所需的大部分工具,如代码管理工具,调试工具等等,我们平时的使用只发挥了 Vistual Studio 的很少功能。

我们在这里面写程序,在这里面运行就可以看到程序运行的结果,IDE帮我们做了很多事,可以提高我们的效率,但 IDE 也只是个写程序的工具,不能离开IDE就变得不会写代码了。

可以写 C++ 的 IDE 也不止 Vistual Studio 一个,还有开源的 Code:Blocks,C++ 版的 Eclipse,Qt Creator,Jetbrain 公司的 CLion 等等。

本次课设我们就使用 Vistual Studio 来写,老师使用的 Vistual Studio 2010,同学们用 这个版本或者更新的版本都是可以的,不要再使用 VC++6.0 这个老掉牙的IDE了。

MFC:全称是 Microsoft Foundation Classes,翻译过来是 微软基础类库,这是用 C++ 语言封装 Windows API 的一个框架。

Windows API 就是和 Windows 操作系统打交道的相关函数,这些函数都是基于面向过程的, 我们可以直接使用 C语言就可调用这些函数来编写 Windows应用程序。

MFC 经过 C++ 语言的封装,是基于面向对象的,我们使用 MFC 这个框架 更容易编写 Windows 程序。

框架,同学们可以认为是一个半成品,框架只是一些操作的封装,我们使用框架编写程序,可大大提高我们的编程效率,帮助我们更好的完成工作。

相信通过上面的讲解,同学们应该能够区分 C++,VC++,Vistual Studio,MFC 这几个概念了,大家课下也可以上网查阅资料,更深层次的了解。

2. 面向对象编程

(形式:打开各个图形类头文件和源文件)

本次课程设计我们使用 C++ 作为我们的编程语言,采用面向对象的编程思想,但是很多同学还不能较好理解面向对象中的核心思想。

面向对象的三大特性:封装,继承,多态,相信同学们背都会背,但要想真正的理解,需要在编程中体会,理解才会加深。

下面老师结合本次课程设计,再来捋一捋这三个特性在本次课程设计中的运用。

要想封装类,首先要根据我们的需要设计类,经过我们的分析,我们把图形的原点,边长,边框类型,填充类型等属性作为类的成员变量做了封装。

绘图的方法,序列化的方法和匹配的方法等作为类的成员函数封装在类中。

但是在封装时,一些同学经常会因为乱用 public,protected,private 这三个访问限定符而在编译时出错。

封装的思想,我们可以在C语言的结构体找到相似点,结构体中也可以封装属性,不同的是C语言的结构体不能直接封装方法,并且也没有访问限定符。

把一个类封装到什么程度,就需要使用访问限定符来做限制。

不考虑继承,protected 和 private 限制的属性和方法是不能直接使用对象访问的,而要使用该类中 public 修饰的方法来访问。

前面老师为了方便访问类中属性,把基类中的属性都设置为了 public 访问限制符,少写了获取属性值的 get 方法和设置属性值的 set 方法,大家知道就好。

C++ 的继承相比其他高级语言更复杂,如 Java,Python,其中一点就是 C++ 在继承时还要使用限制符,相信这也是大家有时候难以理解的原因。

我们在编写图形类使用了继承,正方形类和矩形类等都继承图元基类,继承的目的是想更好的代码复用,因为六种图形类中有相似的地方,这时我们就使用了继承来减少重复代码。

我们使用 public 继承,所以继承后基类中访问限制属性 public 不发生改变,这也是我们常用的继承方式。

继承是可以减少我们的代码量,但也会增加类之间的耦合性,如果基类设计的不好,那么继承它的后代子类都多少会受到影响,这就是继承带来的坏处。

多态增加了代码的灵活性,在图形数组的遍历后,我们使用基类指针来访问每一个图形子类对象中的方法,相信大家感受到了多态的使用了吧。

本次课程设计中对面向对象编程的使用,大家一定要掌握,这算是很基本和很典型的面向对象的使用。

大家已经在 C语言中学习了面向过程编程,又在 C++ 面向对象编程,老师给大家抛出一个问题,面向对象相比面向过程编程是更好的编程方式吗?

大家可以在接下来的学习中思考这个问题,如果你能对这个问题说出自己的见解,编程水平就已经有提高了。

3. 使用 MFC 框架

(形式:打开 DrawingView.cpp 文件)

使用 MFC 框架编写绘图程序,有一个很典型的错误,老师给大家讲一讲。

第一个是在 OnLButtonDown() 函数 switch 部分根据选项来绘图时,(指针指到这里)有些同学直接在 case 语句中使用绘图函数,所以每个 case 语句中都写了大量重复的绘图代码。

这些同学是对 DrawingDoc 文件保存图形对象的作用不理解,也可以说对单文档的 MFC 应用程序工作流程不明白。

还有一个错误当时让老师帮他解决,老师也是 Debug 调试了半天才发现,这是一个使用图形属性对话框的逻辑错误。

我们在前面讲到,要在对话框消失之前,用户按下确认按钮之后获取对话框界面上的值。

而这个同学是在获取对话框界面上的值时,对话框类中却没有他要获取的值的变量,结果在对话框消失之后,他使用对话框对象得到界面上的值一直报空指针异常,他自己也找不出是哪里的错误。

对话框都消失了,界面上的值就是未知的了,所以他这样做当然会出错啦!

这两个错误是都很有代表性的错误,希望同学们吸取他们的教训,不要再犯类似的错误。