8.6.3 实现CBox类(4)
4. 定义CBox类
如果在Class View上单击Ex8_08左边的+号,则会展开该项目树,我们看到现在项目中已经定义了CBox类。项目中的所有类都将显示在这个树中。通过双击树中的类名,或者像前面所说的那样使用代码窗格上方的控件,我们就可以查看为类定义提供的源代码。
已经生成的CBox类定义首先是一条预处理器指令:
- #pragma once
该指令的作用是防止编译器在编译过程中多次将该文件打开并嵌入到源代码中。通常,类定义将被嵌入项目中的多个文件中,因为每个引用特定类名的文件都需要访问类的定义。有些情况下,头文件本身可能包括嵌入其他头文件的#include指令,这将导致某个头文件的内容有可能在源代码中多次出现。编译过程中出现某个类的多次定义是不允许的,这种情况将被标记为错误。在每个头文件的开头部分都放上#pragma once指令,可以确保不出现这种错误。
注意,#pragma once是Microsoft特有的指令,在其他开发环境中可能不被支持。如果预计所开发的代码可能需要在其他环境中编译,那么可以在头文件中使用下面的指令形式达到相同的效果:
- // Box.h header file
- #ifndef BOX_H
- #define BOX_H
- // Code that must not be included more than once
- // such as the CBox class definition
- #endif
重要的几行都以阴影显示,它们是任何ISO/ANSI C++(www.cppentry.com)编译器都支持的指令。只要没有定义符号BOX_H,编译过程中就将嵌入#ifndef指令后面一直到#endif指令之前的所有代码行。#ifndef后面那一行定义了符号BOX_H,从而确保了该头文件中的代码不能被第二次嵌入。因此,这种方法与在头文件开始处放置#pragma once指令具有相同的效果。显然,#pragma once指令更简单、更整洁,因此如果只想在Visual C++(www.cppentry.com) 2008开发环境中使用自己的代码,则最好使用该指令。有时候,我们看到#ifndef/#endif组合可以写成下面这样:
- #if !defined BOX_H
- #define BOX_H
- // Code that must not be included more than once
- // such as the CBox class definition
- #endif
Class Wizard生成的Box.cpp文件包含下面的代码:
- #include "Box.h"
-
- CBox::CBox(void)
- {
- }
-
- CBox::~CBox(void)
- {
- }
第一行是一条#include预处理器指令,其作用是将Box.h文件的内容(即类定义)嵌入Box.cpp文件中。这是必要的,因为Box.cpp文件中的代码引用了类名CBox,而只有类定义可用时才能确定名称CBox的意义。
添加数据成员
现在我们可以添加私有数据成员m_Length、m_Width和m_Height。在Class View中右击CBox,并从上下文菜单中选择Add/Add Variable。然后在Add Member Variable Wizard对话框中,我们可以为希望添加到该类的第一个数据成员指定名称、类型和访问特性。
在该对话框中指定新数据成员的方式非常具有解释性。如果我们为某个数据成员指定了下限,那么还必须指定一个上限。当我们指定上下限时,.cpp文件中的构造函数定义将被修改成为该数据成员添加一个对应于下限的默认值。如果愿意,我们可以在下半部分的输入字段中添加注释。当单击OK按钮时,该变量以及我们提供的注释将被添加到类定义中。我们应该为其他两个类数据成员m_Width和m_Height重复上述过程。之后,Box.h文件中的类定义将被修改成如下形式:
- #pragma once
-
- class CBox
- {
- public:
- CBox(void);
- public:
- ~CBox(void);
- private:
- // Length of a box in inches
- double m_Length;
- // Width of a box in inches
- double m_Width;
- // Height of a box in inches
- double m_Height;
- };
如果愿意,我们完全可以直接手工将这些成员的声明输入到代码中。我们有权选择是否使用IDE提供的自动功能,也可以手工删除掉自动生成的内容,但不要忘记有时候需要同时修改.h和.cpp文件。手工修改之后保存所有文件,这样将更新Class View中的信息。
如果我们查看Box.cpp文件,那么可以看到Wizard已经在构造函数定义中为刚才添加的那些数据成员添加了初始化列表,列表中将各个变量初始化为0。我们接下来将修改构造函数,以便做我们想做的事情。