列表

详情


阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
  现欲构造一文件/目录树,采用组合(Composite)设计模式来设计,得到的类图如5-1所示:

 

                                                           图5-1类图


【C++代码】
#include
#include
#include
using namespace std;
 
class AbstractFile{
protected:
   string name;   //文件或目录名称
public:
   void printName(){cout<    virtual void addChild(AbstractFile*file)=0  ;  //给一个目录增加子目录或文件
   virtual void removeChild(AbstractFile*file)=0  ;  //删除一个目录的子目录或文件
   virtual list< AbstractFile *> *getChildren()=0  ; //获得一个目录的子目录或文件
};
class File:public AbstracFile{
public:
  File(string name){   (1)   =name;}
  void addChild(AbstractFile*file) { return; }
  void removeChild(AbstractFile*file) { return; }
   (2)   getChildren(){ return   (3)    ;}
};
classFolder :public AbstractFile{
private:
  list< AbstractFile *>childList;   //存储子目录或文件
public:
  Folder(string name){   (4)   name;}
  void addChild(AbstractFile*file) {childList.push_back(file); }
  void removeChild(AbstractFile*file) { childList.remove(file); }
  list< AbstractFile *>*getChildren(){return   (5)   ; }
};
void main(){
 //构造一个树形的文件/目录结构
 AbstractFile*rootFolder=new Folder(“c:\\”);
 AbstractFile*compositeFolder=new Folder(“composite”);
 AbstractFile*windowsFolder=new Folder(“windows”);
AbstractFile*file= new File(“TestComposite.java”);
rootFolder->addChild(compositeFolder);
rootFolder->addChild(windowsFolder);
compositeFolder->addChild(file);
}

 

 
                                                        图5-1类图


【C++代码】
#include
#include
#include
using namespace std;
 
class AbstractFile{
protected:
   string name;   //文件或目录名称
public:
   void printName(){cout<    virtual void addChild(AbstractFile*file)=0 ;   //给一个目录增加子目录或文件
   virtual void removeChild(AbstractFile*file)=0   ; //删除一个目录的子目录或文件
   virtual list< AbstractFile > *getChildren()=0  ; //获得一个目录的子目录或文件
};
class File:public AbstractFile{
public:
  File(string name){   (1)   =name;}
  void addChild(AbstractFile*file) { return; }
  void removeChild(AbstractFile*file) { return; }
   (2)   getChildren(){ return   (3)    ;}
};
classFolder :public AbstractFile{
private:
  list< AbstractFile *>childList;   //存储子目录或文件
public:
  Folder(string name){   (4)   name;}
  void addChild(AbstractFile*file) {childList.push_back(file); }
  void removeChild(AbstractFile*file) { childList.remove(file); }
  list< AbstractFile *>*getChildren(){return   (5)   ; }
};
void main(){
 //构造一个树形的文件/目录结构
 AbstractFile*rootFolder=new Folder(“c:\\”);
 AbstractFile*compositeFolder=new Folder(“composite”);
 AbstractFile*windowsFolder=new Folder(“windows”);
AbstractFile*file= new file(“TestComposite.java”);
rootFolder->addChild(compositeFolder);
rootFolder->addChild(windowsFolder);
compositeFolder->addChild(file);
}

参考答案:

(1)this->name
(2)list<AbstractFile*>*
(3)NULL
(4)this->name
(5)&childList

详细解析:

       本题考查基本面向对象设计中设计模式的运用能力。
  组合设计模式主要是表达整体和部分的关系,并且对整体和部分对象的使用无差别。题目中AbstractFile是File类和Folder类的父类,它抽象了两个类的共有属性和行为,在后续main方法的使用中,不论是File对象还是Folder对象,都可被当作AbstractFile对象来使用。另外,由于Folder对象可以聚合其他的Folder对象和File对象,等价于Folder对象可以聚合另一个AbslractFile对象。
  在类File和类Folder的构造函数中都需要记录文件或目录的名称,因此空(1)和空(4)处主要是设置对象的名称。因为File对象不再聚合其他的对象,所以File对象没有孩子节点,因此,空(3)处应该返回NULL。getChildren()方法继承自AbstractFile类,因此其返回类型也应保持一致。对于空(5),要求返回Folder对象的孩子对象,因此返回其成员childList的地址。

上一题