瘦用Shape类层次结构的多态性的屏幕管理器)开发一个基本图形软件包。使用习题13.13中实现的Shape类层次。仅限于二维形状,如正方形、长方形、三角形和圆。和用户进行交互,让用户指定形状、位置和大小;以及绘制每个形状时所用的填充字符。用户可以指定多于一个的同样形状。当你创建每个形状时,都将指向新Shape 对象的一个Shape*指针添加到一个数组中。每个 Shape 类应用它自己的draw 成员函数。编写一个遍历上述数组的多态的屏幕管理器,向数组中的每个对象发送draw消息,以形成屏莓图像。每次当用户指定新添的一个形状时,要重新绘制整个屏幕图像。
时间: 2023-06-25 13:04:21 浏览: 93
这个题目涉及到了多态性、类层次、指针和动态内存分配等知识点。下面是一个简单的解决方案:
1. 定义基本图形类Shape,其中包含纯虚函数draw(),表示绘制形状的操作。其他派生类如Circle、Square、Triangle等都需要实现自己的draw()函数。
```c++
class Shape {
public:
virtual void draw() const = 0; // 纯虚函数,表示绘制形状
};
```
2. 定义派生类Circle、Square、Triangle等,实现自己的draw()函数。这里以Square为例:
```c++
class Square : public Shape {
public:
Square(int x, int y, int size, char fillCh) : mX(x), mY(y), mSize(size), mFillCh(fillCh) {}
virtual void draw() const { // 实现绘制正方形的操作
// 这里使用cout输出形状,也可以使用其他图形库绘制
for (int i = 0; i < mSize; i++) {
for (int j = 0; j < mSize; j++) {
if (i == 0 || i == mSize - 1 || j == 0 || j == mSize - 1) {
cout << mFillCh;
} else {
cout << " ";
}
}
cout << endl;
}
}
private:
int mX, mY; // 左上角坐标
int mSize; // 边长
char mFillCh; // 填充字符
};
```
3. 定义屏幕管理器Screen,其中包含一个Shape*数组,可以添加、删除形状,以及绘制整个屏幕。这里使用动态内存分配来分配Shape*数组的空间。
```c++
class Screen {
public:
Screen(int maxShapes) : mMaxShapes(maxShapes), mNumShapes(0) {
mShapes = new Shape*[maxShapes];
}
~Screen() {
for (int i = 0; i < mNumShapes; i++) {
delete mShapes[i];
}
delete[] mShapes;
}
void addShape(Shape* shape) {
if (mNumShapes < mMaxShapes) {
mShapes[mNumShapes++] = shape;
}
}
void removeShape(int index) {
if (index >= 0 && index < mNumShapes) {
delete mShapes[index];
for (int i = index; i < mNumShapes - 1; i++) {
mShapes[i] = mShapes[i + 1];
}
mNumShapes--;
}
}
void drawAll() const {
for (int i = 0; i < mNumShapes; i++) {
mShapes[i]->draw();
}
}
private:
Shape** mShapes; // 指向Shape对象的指针数组
int mMaxShapes; // 数组最大容量
int mNumShapes; // 数组当前元素个数
};
```
4. 在主函数中,创建Screen对象,循环接受用户输入的命令,根据命令执行添加、删除、绘制等操作。每次添加或删除形状时,都需要重新绘制整个屏幕。
```c++
int main() {
Screen screen(10); // 创建Screen对象,最多容纳10个形状
while (true) {
cout << "Enter command (add, remove, draw, quit): ";
string cmd;
cin >> cmd;
if (cmd == "add") {
cout << "Enter shape (square, circle, triangle): ";
string shapeType;
cin >> shapeType;
if (shapeType == "square") {
int x, y, size;
char fillCh;
cout << "Enter x, y, size, fill character: ";
cin >> x >> y >> size >> fillCh;
Shape* shape = new Square(x, y, size, fillCh);
screen.addShape(shape);
screen.drawAll();
} else if (shapeType == "circle") {
// ...
} else if (shapeType == "triangle") {
// ...
} else {
cout << "Invalid shape type." << endl;
}
} else if (cmd == "remove") {
int index;
cout << "Enter index of shape to remove: ";
cin >> index;
screen.removeShape(index);
screen.drawAll();
} else if (cmd == "draw") {
screen.drawAll();
} else if (cmd == "quit") {
break;
} else {
cout << "Invalid command." << endl;
}
}
return 0;
}
```
以上就是一个简单的基本图形软件包的实现。需要注意的是,在实际开发中,需要考虑更多的细节和异常情况,比如越界访问、内存泄漏等。
阅读全文