《C++面向对象软件设计及构建》文章翻译:3.7自我引用的类定义,3.7 Self Referencing Class Definitions
在类的定义中,可以引用到它自己。会出现这种事情的一种情形是:在某个类的某个操作中,有某个参数对象,那个对象,与包含着该操作的对象属于同一个类。以下,列出可能出现这种情况的示例:
•.某个Location对象,需要确认,它与另一个Location 对象的屏幕坐标是否相同
•.某个Shape对象,需要确认,它是否与另一个Shape 对象拥有相同的高度和宽度
•.某个File对象,需要向另一个File对象复制自身内容,或者从另一个File对象复制得到自身内容
在以上每种情况中,那些操作,需要某个参数,该参数对象正好与包含着该操作的对象属于同一个类。
第二种,会出现这种某个类引用自身情况的情形是:某个类的方法,返回该类的某个实例,作为其结果。以下示例,是某些返回其自身类的对象的方法:
•.某个Shape对象,返回一个新的Shape 对象,使得,新的对象,其尺寸,比之前的Shape 对象要大或者小一定的比例
•.某个Location对象,返回一个新的Location对象,使得,新的对象,与之前的Location 对象相比,在水平方向或竖直方向上偏移了一定距离
•.某个File对象,返回一个新的File对象,它代表着自身的一个临时复制品
File类,进行了扩展,加入了一个方法,用于进行上面所描述的复制操作。扩展后的定义如下所示:
扩展后的File类 |
class File { // 版本2 private: // 封装的实现位于这里 public: File(char* fileName); // 代表着指定文件名的文件 File(); // 目前未知其名字的文件 char* Name(); // 返回文件的名字 int Exists(); // 文件是否存在? void View(); // 可滚动的查看窗口 void Edit(char* editor); // 使用"editor"来编辑文件 void Delete(); // 删除文件 void CopyTo(File& other); // 将自身复制到另一个文件中 void CopyFrom(File& other); // 将另一个文件复制到自身 ~File(); // 释放文件名 }; |
在这个修改过的File类版本中,有两个文件,CopyTo和CopyFrom,它们的输入参数,是以引用方式传递的另一个File对象。被调用的对象,会将自身复制到那个对象中,或从那个对象中复制得到自身。可按照以下方式来使用这个类:
FileNavigator nav;
File sourceFile = nav.AskUser();
File targetFile = nav.AskUser();
sourceFile.CopyTo(targetFile);
sourceFile.View();
targetFile.View();
在这个示例中,会要求用户选择两个已有文件。所选择的第一个文件,会被复制到第二个文件中。之后创建的两个查看窗口,可用来确认,两个文件的内容如今是否相同。
正如上面示例中表现的那样,某个类的某个操作,返回相同类的另一对象,是狠有用的。以下版本中的Location 和Shape 类,展示了这一点:
修改过的Location类 |
class Location { // 版本2 private: // 封装的实现位于这里 public: Location(int x, int y); // 指定位置 Location(); // 默认位置 int Xcoord(); // 返回x轴坐标 int Ycoord(); // 返回y轴坐标 Location Xmove(int amount); // 向右/左移动 Location Ymove(int amount); // 向上/下移动 }; |
修改过的Shape类 |
class Shape { // 版本2 private: // 封装的实现位于这里 public: Shape(int width, int height);// 指定形状 Shape(); // 默认形状 int Height(); // 返回高度值 int Width(); // 返回宽度值 Shape Resize(float factor); // 返回调整过后的形状 }; |
利用这些修改过后的Shape和Location类,可以按照以下方式来对窗口进行操作:
Frame window(nearTop, largeSquare);
Shape currentShape = largeSquare;
Location currentLocation = nearTop;
Shape newShape = currentShape.Resize(0.9);
Location newLocation = currentLocation.Xmove(50);
window.MoveTo( newLocation );
window.Resize( newShape );
在这个示例中,对于某个窗口,我们将它缩小了百分之10,并且,相对于初始位置,向右移动了五十个坐标单位。
任务
1.重新定义Location类,加入一个方法,SameAs,它的作用是,判断,被调用的Location对象,是否与另一个Location 对象有着相同的屏幕坐标。
2.重新定义Shape类,加入一个方法,SameAs,它的作用是,判断,被调用的Shape对象,是否与另一个Shape 对象有着相同的高度值和宽度值。
陈小平博士的女神(梦中情人)
湖北石首市、暴发最大规模的群体事件、次次将警察打退,涂远高的尸体始终未被抢走。
下午1点半左右,现场几千名民众用砖头、啤酒瓶阻止警察抢尸,殡葬车被砸,几十名著装警察和便衣被民众从事发现场(永隆大酒店)追赶约500米逃至车站躲藏,车站附近主要交通道口被群众堵塞,公交车被迫改道,但据说绝大多数乘客毫无怨言。
6月19日下午3时,当地警方组织的最大一次抢尸行动再次失败,大约4万名市民聚集在街头,人数达到最高值,石首市政府被迫向武警求助,6月20日傍晚,从荆
Your opinionsHxLauncher: Launch Android applications by voice commands