8.9.3 实现CBox类(4)
有两种将bBox放入aBox的可能性:一是bBox的长度与aBox的长度同向,二是bBox的长度与aBox的宽度同向。从图8-7可以看出,最好的包装结果是旋转bBox,用aBox的长度除以bBox的宽度。
另一个用于获得已包装好的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)提供的创建和维护用户类代码的功能,这意味着只需要做较少的工作,但也意味着代码中某些地方将略微不同。
首先创建一个名为Ex8_12的WIN32控制台应用程序项目,然后选中Empty project应用程序选项。如果这时选择Class View选项卡,那么将看到如图8-8所示的窗口。别忘了把项目的Character Set属性设置为Not Set。
该窗口将显示项目中所有类的视图,不过此刻当然一个类也没有。虽然还没有定义的类或与之相关的其他内容,但Visual C++(www.cppentry.com)已经为包括这些类预先作了安排。可以使用Visual C++(www.cppentry.com)来创建CBox类的框架和与之相关的文件。在Class View中右击Ex8_12,并从弹出菜单中选择Add | Class选项。然后,可以在显示的Add Class对话框左窗格中,从类种类列表中选择C++(www.cppentry.com),并在右窗格中选择C++(www.cppentry.com) Class模板,之后按下Enter键。(忽略这个对话框中的Name和Location输入字段,它们是禁用的。)接着在如图8-9所示的对话框中,可以输入希望创建的类的名称CBox。

该对话框中指出的文件名Box.cpp用来包含由类的函数成员定义组成的类实现代码-- 即类的可执行代码。如果愿意,那么可以修改该文件的名称,但现在Box.cpp看起来是个不错的文件名。类定义将存储在名为Box.h的文件中。这是组织程序的标准方式。由类定义组成的代码存入扩展名为.h的文件,而定义函数的代码则存入扩展名为.cpp的文件。通常,各个类定义存入各自的.h文件,而各个类实现代码存入各自的.cpp文件。
当单击该对话框中的Finish按钮时,将发生两件事情:
(1) 创建包含CBox类定义框架的Box.h文件,其中包括无参数的构造函数和析构函数。
(2) 创建Box.cpp文件,其中包括CBox类定义中构造函数和析构函数的框架实现代码-- 两个函数体当然都是空的。
编辑器窗格目前显示Box.h文件中类定义的代码。编辑器窗格中的第二个选项卡显示Box.cpp文件的内容,即构造函数和析构函数的框架实现代码。
下面以Visual C++(www.cppentry.com)自动提供的代码为基础来开发CBox类。