8.6.3 实现CBox类(5)
定义构造函数
我们需要修改类定义中无参数构造函数的声明,从而使其包含带默认值的参数,修改后的原型如下:
- CBox(double lv = 1.0, double wv = 1.0, double hv = 1.0);
现在,我们可以实现该函数。打开Box.cpp文件-- 如果尚未打开的话,将构造函数的定义修改成如下形式:
- CBox::CBox(double lv, double wv, double hv)
- {
- lvlv = lv <= 0.0 1.0 : lv;
- // Ensure positive
- wvwv = wv <= 0.0 1.0 : wv;
- // dimensions for
- hvhv = hv <= 0.0 1.0 : hv;
- // the object
-
- m_Length = lv>wv lv : wv;
- // Ensure that
- m_Width = wv<lv wv : lv;
- // length >= width
- m_Height = hv;
- }
记住,成员函数形参的初始化列表只应该出现在类定义中的成员声明中,而非函数的定义中。如果将它们放在函数定义中,则代码将不能编译。前面曾经介绍过这里的代码,因此不再讨论。此刻单击Save工具栏按钮保存文件是个好主意。应该养成在切换到其他窗口之前,保存所编辑文件的习惯。如果需要再次编辑构造函数,那么通过在Class View选项卡底下的窗格中双击相应的项目,或者从代码显示窗格右上角的下拉菜单中选中该函数,即可轻松地使之再次出现在屏幕上。
我们还可以通过在Class View窗格中右击相应的名称,并从出现的上下文菜单中选择适当的菜单项,直接进入.cpp文件中某个成员函数的定义或.h文件中该函数的声明。
添加函数成员
现在需要给CBox类添加前面看到的所有函数。此前,我们在类定义内部定义了若干函数成员,因此这些函数将自动成为内联函数。通过在类定义中手工为这些函数输入代码,或者使用Add Member Function Wizard,我们可以达到相同的结果。
有人可能认为,我们可以在.cpp文件中定义各个内联函数,然后给这些函数定义添加inline关键字。但这里的问题是内联函数终归不是"真正的"函数。因为各个函数体的代码必须直接插入到调用它的位置,所以函数定义必须在包含它的文件被编译时可以使用。如果不能,我们将得到连接器生成的错误,程序将不能运行。如果我们希望成员函数是内联函数,则必须在类的.h文件中包括函数定义。在.h文件中,这些函数可以在类定义内部定义,也可以紧跟在类定义之后定义。我们应该将任何需要的全局内联函数放入.h文件,并将该文件嵌入任何使用这些函数的.cpp文件。
为了添加内联的GetHeight()函数,应当在Class View选项卡上右击CBox,并从上下文菜单中选择Add | Add Function…,然后我们就可以在显示出来的对话框中输入定义函数的数据,该对话框如图8-11所示。
|
| (点击查看大图)图 8-11 |
我们可以通过下拉列表将返回类型指定为double,但也可以直接输入。显然,对于那些没有出现在列表中的类型,我们只能从键盘上输入。选中inline复选框将确保GetHeight()被创建成内联函数。注意其他几个将函数声明为static、virtual或pure的选项。我们知道,静态成员函数可以独立于任何类对象存在。我们将在第9章讨论虚函数和纯虚函数。GetHeight()函数没有形参,因此不需要再添加什么内容。单击OK按钮将给Box.h文件中的类定义添加这个函数定义。如果我们为GetWidth()、GetLength()和Volume()成员函数重复上述过程,则Box.h文件中的CBox类定义将如下所示:
- #pragma once
-
- class CBox
- {
- public:
- CBox(double lv = 1.0, double wv = 1.0, double hv = 1.0);
- ~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;
- public:
- double GetHeight(void)
- {
- return 0;
- }
-
- double GetWidth(void)
- {
- return 0;
- }
-
- double CBox::GetLength(void)
- {
- return 0;
- }
-
- // Calculate the volume of a box
- double Volume(void)
- {
- return 0;
- }
- };