阅读下列函数说明和C++代码,将应填入(n)处的字句写在对应栏内。 [说明] 在一些大型系统中,大多数的功能在初始化时要花费很多时间,如果在启动的时候,所有功能(包括不用的功能)都要全面初始化的话,会导致应用软件要花很多时间才能启动。因此常

admin2010-12-17  18

问题 阅读下列函数说明和C++代码,将应填入(n)处的字句写在对应栏内。
   [说明]
   在一些大型系统中,大多数的功能在初始化时要花费很多时间,如果在启动的时候,所有功能(包括不用的功能)都要全面初始化的话,会导致应用软件要花很多时间才能启动。因此常将程序设计成到了实际要使用某种功能的阶段才初始化该功能。
   以下示例展示了Proxy(代理)模式,PrinterProxy类执行一些比较“轻”的方法,需要真正执行“重”的方法时才初始化Print类。图5-1显示了各个类间的关系。
   [图5-1]
   
   [C++代码]
   class Printable{
   public:
   virtual void setPrinterName(string name)=0;
   virtual  string getprinterName()=0;
   virtual void print(string name)=0;
   };
   class Printer:public Printable{
   private:
   string name;
   public:
   Printer(string name){
   cout<<"正在产生Printer的对象实例"<<endl;
   this->name=name;
   }
   void setPrinterName(string name){
   this->name=name;
   }
   string getPrinterName(){
   return name;
   }
   void print(string msg){
   cout<<"======="<<name<<"==========="<<endl;
   cout<<msg<<endl;
   }
   };
   class printerproxy :public  (1)  {
   private:
   String name;
   Printer *real;
   public:
   PrinterProxy(string name){
     (2)=NULL;
   this->name=name;
   }
   void setPrinterName(string name){
   if((3))real->setPrinterName(name);
   this->name=name;
   }
   string getPrinterName(){
   return name;
   }
   void print(string msg){
     (4);
   real->print(msg);
   }
   void realize(){
   if(real==NULL)real=(5);
   }
   };
(5)

选项

答案new Printer(name)

解析 由类图可知PrinterProxy类是Printable的子类,因此应声明为继承自Printable,故空(1)应填Printable。
   real是一个Printer对象指针,应该进行初始化,初始化工作是在构造函数中完成的,若不进行初始化的话,realize()方法将不可预期,故空(2)应填real。
   real是一个指针,调用之前当然得先判断real是否为空指针,只有不是空指针才能进行调用,否则将出现不可预期的结果,因此空(3)应填real!=NULL。
   在执行打印时,需要保证已经正确生成了real对象,否则打印将无法完成,这也正是Proxy的核心所在,到真正需要打印时,才生产real对象,因此空(4)应填realize()。
   real是Printer对象指针,空(5)是生成一个Printer对象,注意Printer类的构造函数是Printer(string name),故应填new Printer(name)。
转载请注明原文地址:https://kaotiyun.com/show/NqDZ777K
0

最新回复(0)