8.6.3 实现CBox类(3)
另一个用于获得已包装好的aBox中剩余空间的分解运算符函数operator%()更加简单,因为可以使用刚才编写的运算符来实现。我们可以将其编写成普通的全局函数,因为该函数不需要访问CBox类的私有成员。
- // Operator to return the free volume in a packed box
- double operator%(const CBox& aBox, const CBox& bBox)
- {
- return aBox.Volume() - ((aBox/bBox)*bBox.Volume());
- }
使用现有的类函数,这里的计算变得非常容易。结果是大箱子aBox的体积减去可以容纳的全部bBox箱子的体积。aBox中包装的bBox对象数量由表达式aBox/bBox给出,该表达式使用了前面重载的/运算符。得到的数量再乘以bBox对象的体积,就是要从大箱子aBox的体积中减去的体积。
至此类的接口就完成了。对于生产问题的解决方案来说,无疑还需要许多其他函数。但作为有趣的、示范如何为解决具体问题而对类进行设计的实用模型,这个类已经足够了。我们现在可以继续前进,试着解决一个实际的问题。
试一试:使用CBox类的多文件项目
在实际编写使用CBox类及其重载运算符的代码之前,首先需要将类定义汇集成相干的整体。我们将采用与以前完全不同的方法-- 即编写多文件的项目。我们还要使用Visual C++(www.cppentry.com) 2008提供的创建和维护用户类代码的功能,这意味着只需要做较少的工作,但也意味着代码中某些地方将略微不同。
首先创建一个名为Ex8_08的WIN32控制台应用程序项目,然后选中Empty project应用程序选项。如果这时选择Class View选项卡,我们将看到如图8-8所示的窗口。
|
| (点击查看大图)图 8-8 |
该窗口将显示项目中所有类的视图,不过此刻当然一个类也没有。虽然还没有被定义的类或与之相关的其他内容,但Visual C++(www.cppentry.com) 2008已经为包括这些类预先作了安排。我们可以使用Visual C++(www.cppentry.com) 2008来创建CBox类的骨架和与之相关的文件。在Class View中右击Ex8_08,并从弹出菜单中选择Add/Class。然后,我们可以在显示出来的Add Class对话框左窗格中从类种类列表中选择C++(www.cppentry.com),并在右窗格中选择C++(www.cppentry.com) Class模板,之后按下Enter键。然后,在如图8-9所示的Generic Class Wizard对话框中,我们可以输入希望创建的类的名称CBox。
|
| (点击查看大图)图 8-9 |
该对话框中指出的文件名Box.cpp用来包含由类的函数成员定义组成的类实现-- 即类的可执行代码。如果愿意,可以修改该文件的名称,但现在Box.cpp看起来是个不错的文件名。类定义将被存入名为Box.h的文件中。这是组织程序的标准方式。由类定义组成的代码存入扩展名为.h的文件,而定义函数的代码则存入扩展名为.cpp的文件。通常,各个类定义存入各自的.h文件,而各个类实现存入各自的.cpp文件。
当单击该对话框中的Finish按钮时,将发生两件事情:
(1) 创建包含CBox类定义骨架的Box.h文件,其中包括无参数的构造函数和析构函数。
(2) 创建Box.cpp文件,其中包括CBox类定义中构造函数和析构函数的骨架实现-- 两个函数体当然都是空的。
显示代码的编辑器窗格如图8-10所示。如果编辑器目前没有显示出来,那么只需双击Class View中的CBox,该窗格就会出现。
|
| (点击查看大图)图 8-10 |
我们看到,在包含类代码清单的窗格上方有两个控件。左边的控件显示出当前的类名CBox,单击类名右边的按钮将显示项目中所有类的列表。通常,我们可以通过在该控件的列表中进行选择,从而切换到另一个类,但此刻只有一个被定义的类。右边的控件与当前类的.cpp文件中定义的成员有关,单击该控件的按钮将显示当前类的成员。从列表中选中某个成员将使该成员的代码在下面的窗格中可见。
下面我们以Visual C++(www.cppentry.com)自动提供的代码为基础来开发CBox类。