问答题
阅读下列说明和C++代码,在
(n) 处填入适当的字句。
[说明]
现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图10.20所示。
采用该设汁模式的原因在于:系统解析BMP、GIF与JPEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。
【正确答案】(1) this->imp (2) class ImageImp (3) imp->doPaint(m) (4) new BMP
(5) new Winlmp (6) image1->setlmp(imageImp1) (7)17
【答案解析】[要点解析] 本题是用C++来实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行为背景,采用桥接设计模式进行设计。考查考生对面向对象程序设计类图的桥接设计模式的应用能力。下面对程序具体解析。
第(1)空和第(2)空是对Image类的定义,解释如下:
class Image {
public:
void setImp (ImageImp *imp){(1)this→imp=imp;}/*this指针是一个隐含的指针,它指向对象本身,代表了对象的地址。这样本类中的同名指针变量imp就获得了ImageImp类的指针imp的地址。则本类的对象就可以调用ImageImp类及其派生子类中的函数,ImageImp类和Image类就关联起来了*/
virtual void parseFile (string fileName)=0;//定义一个虚函数,用于实现多态protected:
(2) class ImageImp *imp;/*要引用ImageImp类的指针变量,必须先加以声明,否则无法引用*/
};
第(3)空:
class BMP :public Image{
public:
void parseFile(string fileName){ //此处解析BMP文件并获得一个像素
矩阵对象m
(3)imp->doPaint(m);/*显示像素矩阵m将图像文件解析完成后,得到像素矩阵,接下来自然是调用相应的函数将它显示出来。由于imp是父类中的protected成员,因此在子类中可以引用*/
}
};
第(4)、(5)、(6)空在主函数中,解释如下:
void main(){
//在Windows操作系统上查看demo.bmp图像文件
Image*image1=(4)new BMP;/*创建Image类的指针对象,Image类有三个子类分别为BMP、GIF、JPEG,由于此处解析的是BMP文件,故是BMP类型并为它分配内存空间*/ImageImp*ImageImp1=(5)new Winlmp;/*创建ImageImp类的指针对象,ImageImp类有两个子类,分别为WinImp类和LinuxImp类,由于此处是Windows操作系统,故是WinImp类型并为它分配内存空间*/
(6) image1->setImp(imageImp1) ;/*调用该函数,则Image类的对象就可以调用ImageImp类及其派生子类中的函数*/
image1->parseFile("demo.bmp"); /*该函数的实现,需要调用到ImageImp类的子类BMP类中的doPaint函数*/
}
对于第(7)空,10种格式的图像文件说明有10个image类的子类,再加上image类本身就是11个。5种操作系统说明有5个ImageImp类的子类,再加上ImageImp类本身就是6个。故一共是17个类。