阅读以下说明和C++代码,将应填入(n)处。 [说明] 在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplor

admin2008-01-15  40

问题 阅读以下说明和C++代码,将应填入(n)处。
[说明]
   在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组 DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的 DocExplorcr对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个C++源文件中,能够正确编译通过。
[C++代码]
   #include <iostream>
   const OBS_MAXNUM=20;//最多与OfficeDoc对象相关联的DocExplorer对象的个数
     (1);
   class DocExplorer{  //关注OfficeDoc公文对象的类
   public:
         DocExplorer( (2)  *doc);  //构造函数
           (3) void update(OfficeDoc *doc)=0;//更新自身状态的函数
         //其他相关属性和方法省略
   };
   class OfficeDoc{  //公文类
   private:
         DocExplorer *myObs[OBS_MAXNUM];
   //关注此公文类的DocExplorer类对象指针数组
   int index; //与OfficeDoc对象关联的DocExplorer对象的个数
   public:
         OfficeDoe()
               index=0;
         }
         void  attach(DocExplorer *o){
   //将一DoeExplorer对象与OfficeDoe对象相关联
              if(index >=OBS_MAXNUM ||o=NULL)return;
              for(int loop=0; loop<index; loop++)
                    if(myObs[loop]==o) return;
              myObs[index]=o;
              index++;
         }
         void  detaeh(DocExplorer *o){
   //接触某DoeExplorer对象与OfficeDoc对象的关联
              if(0==NULL) return;
              for(int loop=0; loop<index; loop++){
                     if(myObs[loop]==o){
                          if(loop<=index-2)myObs[loop]=myObs[index-1];
                          myObs[index-1]=NULL;
                          index--;
                          break;
                     }
              }
         }
   private:
         void notifyObs(){   //通知所有的DocExplorer对象更改自身状态
               for(int loop=0; loop<index; loop++){
                      myObs[loop]->(4);    //DocExplorer对象更新自身状态
               }
         }
   //其他公文类的相关属性和方法
   };
   DocExplorer::DocExplorer(OfficeDoc *doc){//DocExplorer 类对象的构造函数
        doc->(5);  //将此DocExplorer对象与doc对象相关联
   }

选项

答案(1) class OfficeDoc (2) OfficeDoc (3) virtual (4) update(this) (5) attach(this)

解析 首先,DocExplorer需要知道OfficeDoc是一个类,但因为OfficeDoc定义在 DocExplorer之后,所以需要在DocExplorer类的定义前加上class OfficeDoc的声明,因此(1)空处应该填写class OfficeDoc
   第(2)空可根据程序最后的构造函数的实现知道,应该填写OfficeDoc;在观察者模式中,不同的观察者更新自身的方法不同,因此第(3)空处应该填写virtual,而且程序最后的=0也表明是一个纯虚拟函数;
   第(4)空处,程序注释说明所有与OfficeDoc相关联的对象更新自身状态因此需要使用update函数,但update函数的参数是一个OfficeDoc类的对象。所以,参数应该为this;
   第(5)空将OfficeDoc类的对象和DocExplorer类的对象相关联,关联的函数是 OfficeDoc中的attach方法,其参数是一个DocExplorer对象,使用this能够表示当前的对象,所以应该填写attach(this)。
转载请注明原文地址:https://kaotiyun.com/show/1fDZ777K
0

最新回复(0)