问答题 [C++代码] #include <iostream> const OBS_MAXNUM=20;//最多与OfficeDoc对象相关联的DocExplorer对象的个数 {{U}} (1) {{/U}}; class DocExplorer{ //关注OfficeDoc公文对象的类 public: DocExplorer({{U}} (2) {{/U}} *doc); //构造函数 {{U}} (3) {{/U}} 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]->{{U}} (4) {{/U}}; //DocExplorer对象更新自身状态 } } //其他公文类的相关属性和方法 }; DocExplorer::DocExplorer(OfficeDoc *doc){//DocExplorer 类对象的构造函数 doc->{{U}} (5) {{/U}}; //将此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)。