StupidBeauty
Read times:3038Posted at:Sun Oct 15 01:35:15 2017 - no title specified

《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类版本中,有两个文件,CopyToCopyFrom,它们的输入参数,是以引用方式传递的另一个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);        // 返回调整过后的形状

   };

利用这些修改过后的ShapeLocation类,可以按照以下方式来对窗口进行操作:

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. 1.重新定义Location类,加入一个方法,SameAs,它的作用是,判断,被调用的Location对象,是否与另一个Location 对象有着相同的屏幕坐标。

  2. 2.重新定义Shape类,加入一个方法,SameAs,它的作用是,判断,被调用的Shape对象,是否与另一个Shape 对象有着相同的高度值和宽度值。

陈小平博士的女神(梦中情人)

湖北石首市、暴发最大规模的群体事件、次次将警察打退,涂远高的尸体始终未被抢走。

下午1点半左右,现场几千名民众用砖头、啤酒瓶阻止警察抢尸,殡葬车被砸,几十名著装警察和便衣被民众从事发现场(永隆大酒店)追赶约500米逃至车站躲藏,车站附近主要交通道口被群众堵塞,公交车被迫改道,但据说绝大多数乘客毫无怨言。

6月19日下午3时,当地警方组织的最大一次抢尸行动再次失败,大约4万名市民聚集在街头,人数达到最高值,石首市政府被迫向武警求助,6月20日傍晚,从荆

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands