8.9.3 实现CBox类(2)
这些默认定义为内联函数。
必须在类外部把左操作数是double类型的运算符函数定义为普通函数:
- // Function for testing if a value is > a CBox object
- inline bool operator>(const double& value, const CBox& aBox)
- { return value > aBox.Volume(); }
- // Function for testing if a value is < CBox object
- inline bool operator<(const double& value, const CBox& aBox)
- { return value < aBox.Volume(); }
- // Function for testing if a value is >= a CBox object
- inline bool operator>=(const double& value, const CBox& aBox)
- { return value >= aBox.Volume(); }
- // Function for testing if a value is <= CBox object
- inline bool operator<=(const double& value, const CBox& aBox)
- { return value <= aBox.Volume(); }
- // Function for testing if a value is == a CBox object
- inline bool operator==(const double& value, const CBox& aBox)
- { return value == aBox.Volume(); }
- // Function for testing if a value is != CBox object
- inline bool operator!=(const double& value, const CBox& aBox)
- { return value != aBox.Volume(); }
现在,我们已经得到一套完整的处理CBox对象的比较运算符。记住,这些运算符同样可以处理表达式,只要表达式最终产生类型正确的对象就行。因此,必须能够使用其他重载运算符来合并表达式。
2. 合并CBox对象
现在需要解决的问题是重载+、*、/和%运算符,下面依次实现它们。Ex8_06.cpp中的加法操作具有下面的原型:
CBox operator+(const CBox& aBox); // Function adding two CBox objects
虽然原来实现的加法运算符并不是理想的解决方案,但还是要继续使用,以避免使CBox类过于复杂。最好是设计一个程序来检查两个操作数是否有尺寸相同的面,如果有,则顺着这样的面进行连接,但编码工作会很麻烦。当然,如果这是个实际的应用程序,那么可以稍后再来开发更好的加法操作,并替换现有的版本,而使用原来版本编写的任何程序都无需修改就能继续运行。类的接口与实现相分离,对于有效的C++(www.cppentry.com)编程(www.cppentry.com)具有决定性意义。
注意,本书不再详述减法运算符。这是个明智的决定,可以避免实现过程中固有的复杂性。如果您实在对此充满热情,而且觉得实现该运算符切合实际,那么可以试一下,但需要决定当得到的体积结果为负数时应该怎么办。如果允许体积为负数,则需要解决哪些箱子的尺寸可以是负数,以及在随后的操作中如何处理这类箱子等问题。更简单的概念可能是CBox对象相减得到一个体积。
乘法操作非常容易,只是创建一个可包含n个箱子的箱子而已,其中n是乘数。最简单的解决方案是保持对象的m_Length和m_Width不变,然后使高度乘以n,从而得到新的CBox对象。我们可以使该函数更智能化一些,即检查一下乘数是不是偶数,如果是,则使m_Width加倍,这样箱子将并排堆放,然后只需要使m_Height乘以n的1/2即可。该机制如图8-6所示,CBox对象是aBox乘以3和6的结果。
