8.9.3 实现CBox类(3)
当然,不需要检查新对象的长度和宽度哪个更大,因为构造函数会自动将较大的值挑出来。可以将operator*()函数编写成左操作数是CBox对象的成员函数:
- // CBox multiply operator this*n
- CBox operator*(int n) const
- {
- if(n % 2)
- return CBox(m_Length, m_Width, n*m_Height); // n odd
- else
- return CBox(m_Length, 2.0*m_Width, (n/2)*m_Height); // n even
- }
在这里,使用%运算符判断n是偶数还是奇数。如果是奇数,则n % 2的值是1,if语句为true。如果是偶数,则n % 2的值是0,if语句为false。
现在即可使用刚才编写的函数,实现左操作数是整数的版本。可以将该函数编写成普通的非成员函数:
- // CBox multiply operator n*aBox
- CBox operator*(int n, const CBox& aBox)
- {
- return aBox*n;
- }
该版本的乘法操作仅仅将操作数的顺序颠倒了一下,这样就可以直接使用前面的乘法运算符版本。至此,为CBox对象定义的算术运算符就全部完成了。最后可以看看如何实现两个分解运算符函数operator/()和operator%()。
3. 分解CBox对象
除法操作确定左操作数指定的CBox对象可以包含多少个右操作数指定的CBox对象。为了使问题相对简单,假设所有CBox对象都是以正常层序包装的 -- 即高度是垂直的,另外假设它们都是以相同的朝向包装的 -- 即长度方向相同。如果没有这些假设,问题可能变得相当复杂。
这样,该问题实际上就变为求出一层可以放多少个右操作数对象,再求出左操作数CBox对象中可以放几层。
可以将该运算符编写成下面这样的成员函数:
- int operator/(const CBox& aBox) const
- {
- // Number of boxes in horizontal plane this way
- int tc1 = static_cast<int>((m_Length / aBox.m_Length))*
- static_cast<int>((m_Width / aBox.m_Width));
- // Number of boxes in horizontal plane that way
- int tc2 = static_cast<int>((m_Length / aBox.m_Width))*
- static_cast<int>((m_Width / aBox.m_Length));
- //Return best fit
- return static_cast<int>((m_Height/aBox.m_Height)*(tc1 > tc2 tc1 : tc2));
- }
该函数首先求出左、右操作数CBox对象的长度方向相同时,一层可以容纳多少个右操作数CBox对象,并将结果存入tc1。然后再求出右操作数CBox的长度与左操作数CBox的宽度同向时,一层可以容纳多少个右操作数对象。最后,使tc1和tc2中较大的数乘以可以包装的层数,并返回得到的值。该过程如图8-7所示。
