6-4 带USB接口的电脑
分数 10
全屏浏览题目
切换布局
作者 刘骥
单位 重庆大学
请设计一台具有USB
接口的电脑(Computer
),使得它能够通过USB
接口从硬盘(Disk
)、摄像头(Camera
)、扫描仪(Scanner
)读取数据。
其中USB
接口定义为:
class USB{ public: virtual void read()=0; virtual ~USB(){} };
构造的Computer
需要通过如下测试程序:
#include<iostream>
using namespace std;
class USB{
public:
virtual void read()=0;
virtual ~USB(){}
};
/* 请在这里填写答案 */
int main(){
Computer computer;
//从Disk读取
USB* usb=new Disk();
computer.setUSB(usb);
computer.read();
delete usb;
//从Camera读取
usb=new Camera();
computer.setUSB(usb);
computer.read();
delete usb;
//从Scanner读取
usb=new Scanner();
computer.setUSB(usb);
computer.read();
delete usb;
return 0;
}
输入样例:
输出样例:
从硬盘中读取数据
从摄像头中读取数据
从扫描仪中读取数据
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
别看这个答案很简单,但是这个题说的很不好,computer类是没有给出的,但是要是自己写了,会告诉你重定义所以很可恶....这就恰恰说明了出题人不仔细,老师也是照搬过来就叫我们写,不带多看几眼的.........
下面给出代码:
/*
class Computer :public USB
{
public:
virtual void setUSB(USB* p)
{
m_p = p;
}
virtual void read()
{
m_p->read();
}
private:
USB* m_p;
};
*/
class Disk :public USB
{
public:
virtual void read()
{
cout << "从硬盘中读取数据" << endl;
}
};
class Camera :public USB
{
public:
virtual void read()
{
cout << "从摄像头中读取数据" << endl;
}
};
class Scanner :public USB
{
public:
virtual void read()
{
cout << "从扫描仪中读取数据" << endl;
}
};
/* 请在这里填写答案 */
我在上面注释掉的内容如果题中没有定义computer是可以调试成功并且答案通过的.
虽然不一定是我这样写,但是我觉得我写的是一定很简单的,应该是能看懂的。
下面给出完整代码:
#include <iostream>
#include <cstdio>
using namespace std;
class USB
{
public:
virtual void read()=0;
virtual ~USB(){}
};
class Computer:public USB
{
public:
virtual void setUSB(USB *p)
{
m_p=p;
}
virtual void read()
{
m_p->read();
}
private:
USB *m_p;
};
class Disk:public USB
{
public:
virtual void read()
{
cout<<"从硬盘中读取数据"<<endl;
}
};
class Camera:public USB
{
public:
virtual void read()
{
cout<<"从摄像头中读取数据"<<endl;
}
};
class Scanner:public USB
{
public:
virtual void read()
{
cout<<"从扫描仪中读取数据"<<endl;
}
};
/* 请在这里填写答案 */
int main()
{
Computer computer;
//从Disk读取
USB* usb=new Disk();
computer.setUSB(usb);
computer.read();
delete usb;
//从Camera读取
usb=new Camera();
computer.setUSB(usb);
computer.read();
delete usb;
//从Scanner读取
usb=new Scanner();
computer.setUSB(usb);
computer.read();
delete usb;
return 0;
}
用这个在自己的编译器上调试一定是对的。
说实话,这个题不太符合我的认知。因为下面的main函数里面是调用不是usb->read();而是computer.read();如果是正常我们写的话我感觉应该是前者,因为后者调用是不会调用到派生类的read()的。
所以如果是我自己写这个题,我会把下面的main函数稍微改一下,见下面代码:
#include <iostream>
#include <cstdio>
using namespace std;
class USB
{
public:
virtual void read() = 0;
virtual ~USB() {}
};
class Computer :public USB
{
public:
void setUSB(USB* usb)
{
return;
}
void read()
{
return;
}
};
class Disk :public Computer
{
public:
virtual void read()
{
cout << "从Disk读取" << endl;
}
};
class Camera :public Computer
{
public:
virtual void read()
{
cout << "从Camera读取" << endl;
}
};
class Scanner :public Computer
{
public:
virtual void read()
{
cout << "从Scanner读取" << endl;
}
};
/* 请在这里填写答案 */
int main()
{
Computer computer;
//从Disk读取
USB* usb = new Disk();
computer.setUSB(usb);
usb->read();
//computer.read();
delete usb;
//从Camera读取
usb = new Camera();
computer.setUSB(usb);
usb->read();
//computer.read();
delete usb;
//从Scanner读取
usb = new Scanner();
computer.setUSB(usb);
usb->read();
//computer.read();
delete usb;
return 0;
}