13.14(瘦用Shape类层次结构的多态性的屏幕管理器)开发一个基本图形软件包。使用习题13.13中实现的Shape类层次。仅限于二维形状,如正方形、长方形、三角形和圆。和用户进行交互,让用户指定形状、位置和大小;以及绘制每个形状时所用的填充字符。用户可以指定多于一个的同样形状。当你创建每个形状时,都将指向新Shape 对象的一个Shape*指针添加到一个数组中。每个 Shape 类应用它自己的draw 成员函数。编写一个遍历上述数组的多态的屏幕管理器,向数组中的每个对象发送draw消息,以形成屏莓图像。每次当用户指定新添的一个形状时,要重新绘制整个屏幕图像。
时间: 2023-06-24 20:08:15 浏览: 109
1.泛型类 、通配符的使用、通配符的上限和下限 编写泛型类Stack<E>,该类中定义一个成员变量和如下方法:
5星 · 资源好评率100%
以下是实现该功能的代码:
```cpp
#include <iostream>
#include <vector>
#include "shape.h"
using namespace std;
class ScreenManager {
public:
ScreenManager(int width, int height) : width(width), height(height) {
screen.resize(height, vector<char>(width, ' ')); // 初始化屏幕矩阵
}
void addShape(Shape* shape) {
shapes.push_back(shape); // 将新图形添加到数组中
redraw(); // 重新绘制整个屏幕图像
}
void redraw() {
clearScreen(); // 清空屏幕
for (auto shape : shapes) { // 遍历每个图形
shape->draw(screen); // 绘制该图形
}
show(); // 显示屏幕
}
private:
int width, height;
vector<vector<char>> screen; // 屏幕矩阵
vector<Shape*> shapes; // 图形数组
void clearScreen() {
for (auto& row : screen) { // 将屏幕矩阵中所有元素设为空格
fill(row.begin(), row.end(), ' ');
}
}
void show() {
for (auto& row : screen) { // 输出屏幕矩阵
for (auto ch : row) {
cout << ch;
}
cout << endl;
}
}
};
int main() {
ScreenManager screen(80, 24); // 创建屏幕管理器
char fillChar;
while (true) {
cout << "Enter shape (square, rectangle, triangle, circle): ";
string shapeType;
cin >> shapeType;
Shape* shape = nullptr;
if (shapeType == "square") {
int sideLength;
cout << "Enter side length: ";
cin >> sideLength;
cout << "Enter fill character: ";
cin >> fillChar;
shape = new Square(sideLength, fillChar);
} else if (shapeType == "rectangle") {
int width, height;
cout << "Enter width: ";
cin >> width;
cout << "Enter height: ";
cin >> height;
cout << "Enter fill character: ";
cin >> fillChar;
shape = new Rectangle(width, height, fillChar);
} else if (shapeType == "triangle") {
int base, height;
cout << "Enter base: ";
cin >> base;
cout << "Enter height: ";
cin >> height;
cout << "Enter fill character: ";
cin >> fillChar;
shape = new Triangle(base, height, fillChar);
} else if (shapeType == "circle") {
int radius;
cout << "Enter radius: ";
cin >> radius;
cout << "Enter fill character: ";
cin >> fillChar;
shape = new Circle(radius, fillChar);
} else {
cout << "Invalid shape type." << endl;
}
if (shape != nullptr) {
screen.addShape(shape); // 将新图形添加到屏幕管理器中
}
}
return 0;
}
```
该程序会不断循环,每次提示用户输入一个图形类型,然后根据输入创建相应的图形对象,并让用户指定位置、大小和填充字符。每当用户添加一个新的图形,程序就会重新绘制整个屏幕图像,并将所有图形都显示在屏幕上。
阅读全文