1
增强Screen类,使之在程序中只能生成一个实例 增强MyRectangle类,添加颜色信息 创建MyCircle类 在main函数中创建类的实例。(20分)
题目内容:
修改Screen类:
-
在Screen类中,将保存屏幕宽和高的数据域成员改为 static int 类型。
-
在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”
-
在Screen类中,增加一个 Screen* 类型的静态的私有数据成员 instance;
-
在Screen类中,增加一个静态公有的 getInstance(int width, int height) 函数,该函数返回instance的值。两个参数均带有默认值,分别为 640 和 480
-
在getInstance函数中,判断instance的值,若为0,则设置屏幕的高和宽,然后创建一个存放在堆区的Screen对象,将地址保存在instance中;若instance的值不为0,则返回instance的值
-
在getInstance函数中,如果需要创建Screen对象,则校验宽和高的值;如果宽与高超过1000,或者其它不合理的设置则用cout输出“invalid screen size”,然后结束程序
-
在Screen类中,添加一个deleteInstance()函数(函数类型自行根据main()中的代码确定),将getInstance()函数中申请的内存归还给操作系统。
扫描二维码关注公众号,回复: 3463474 查看本文章 -
在Screen类中,添加一个拷贝构造函数;
-
Screen类的默认构造函数将屏幕宽和高分别设置为640和480
-
Screen类的所有构造函数均应输出字符串enter的内容并换行
-
为screen类添加析构函数,在其中应输出字符串leave的内容并换行
-
删除Screen类中的带参构造函数
-
将Screen类中所有的构造函数都变成 private 成员
-
如有必要,则增加或者修改其他数据成员及函数成员,例如数据域成员的getter与setter函数
-
不要忘记在类外对Screen类的所有静态成员进行初始化,否则编译器会报告链接出错。
-
补充说明:现在的Screen类使用了一种【设计模式】,叫做“单例模式”,可以保证在这个程序中只会有一个Screen的实例。
修改MyRectangle类:
-
在MyRectangle类中,增加表示颜色的数据域成员;
-
在MyRectangle类中,增加函数 setColor(int R, int G, int B);该函数接收三个参数,代表颜色中的Red、Green、Blue分量的大小,该函数将颜色保存在类的数据域成员中。
-
MyRectangle类的构造函数1接受4个整型参数
-
按照顺序,这4整型参数分别为矩形的左上顶点的x、y坐标,以及右下顶点的x、y坐标。(此处不做坐标有效性检查)
-
MyRectangle类的默认构造函数将矩形左上角顶点的坐标均设置为(10,10),将右下角定点坐标设置为(100,100)
-
MyRectangle类的所有构造函数均将表示颜色的数据成员初始化为白色,也就是RGB三个颜色分量的值均为255
-
MyRectangle类的所有构造函数均应使用cout输出字符串“myrectangle”并换行
-
MyRectangle类中应提供setCoordinations()用于设置对角线的左侧及右侧顶点坐标;函数的参数的含义及类型和构造函数1的前4个参数相同。
-
MyRectangle类的Draw()函数不再检查坐标的有效性,也不输出关于坐标无效的信息;
-
在Draw()中用cout输出:
b. 矩形的左上顶点的x、y坐标以及矩形的宽度和高度(坐标值以及宽高等4个数值间以1个空格分隔)然后换行;
c. 矩形的颜色的RGB分量的值,用空格分隔开的三个整数,然后换行 -
如有必要,则增加其他数据成员及函数成员
-
不要输出任何未要求输出的信息,不然会导致系统扣分。
新增MyCircle类:
-
在MyCircle类中,增加表示颜色的数据域成员;
-
在MyCircle类中,增加函数 setColor(int R, int G, int B);该函数接收三个参数,代表颜色中的Red、Green、Blue分量的大小,该函数将颜色保存在类的数据域成员中。
-
MyCircle类的构造函数1接受3个整型参数
-
按照顺序,整型参数分别为圆心的x、y坐标,以及圆的半径。(此处不检查坐标及半径的有效性)
-
MyCircle类的默认构造函数将圆心的坐标设置为(200,200),半径设置为100
-
MyCircle类的“构造函数1”与默认构造函数均将表示颜色的数据成员初始化为白色,也就是RGB三个颜色分量的值均为255
-
为MyCircle类添加拷贝构造函数
-
MyCircle类的所有非拷贝构造函数均应使用cout输出字符串“mycircle”并换行
-
MyCircle类中应提供setCenter(int x, int y)用于设置圆心坐标,提供setRadius(int r)用于设置圆的半径。
-
在Draw()中用cout输出:
-
a. 屏幕的宽度和高度,以空格分隔,然后换行;
b. 圆心的x、y坐标以及半径(坐标值以及半径等3个数值间以1个空格分隔)然后换行;
c. 圆的颜色的RGB分量的值,用空格分隔开的三个整数,然后换行 -
如有必要,则增加其他数据成员及函数成员
-
不要输出任何未要求输出的信息,不然会导致系统扣分。
main() 函数:
需使用如下main()函数(不得更改)
- int main() {
- int width, height;
- cin >> width >> height;
- Screen::getInstance(width, height);
- Screen::getInstance();
- int leftX, leftY, rightX, rightY;
- cin >> leftX >> leftY >> rightX >> rightY;
- MyRectangle myRectangle(leftX, leftY, rightX, rightY);
- myRectangle.setColor(0, 0, 0xff);
- myRectangle.Draw();
- int centerX, centerY, radius;
- cin >> centerX >> centerY >> radius;
- MyCircle myCircles[2];
- (myCircles + 1)->setCenter(centerX, centerY);
- myCircles[1].setRadius(radius);
- myCircles[0].Draw();
- myCircles[1].Draw();
- MyCircle myCircle(myCircles[1]);
- myCircle.Draw();
- Screen::deleteInstance();
- cin.get();
- return 0;
- }
输入格式:
空格分隔的整数
输出格式:
字符串或者空格分隔的整数
输入样例:
800 600
30 20 300 200
10 10 50
输出样例:
invalid screen size
enter screen
leave screen
myrectangle
mycircle
10 300 690 300
255 255 255
---------------------------
第6单元作业预告
第6单元作业,将在本单元作业基础上,创建基类MyShape,以及MyShape的派生类MyRectangle和MyCircle。
如果你已经完成了本单元作业,可以提前学习类的继承。
主要学习静态成员变量,构造函数,析构函数初始化,单例设计模式,析构函数,简单的构造拷贝函数
#include <iostream>
#include <string>
using namespace std;
class Screen
{
public:
int getWidth();
int getHeight();
public:
static Screen* getInstance(int width, int height);
void deleteInstance();
~Screen();
private:
int width_;
int height_;
string enter;
string leave;
static Screen* instance;
private:
void exitWhenInvalidScreen(int width, int height);
Screen(int width, int height);
//Screen();
};
int Screen::getWidth()
{
return width_;
}
int Screen::getHeight()
{
return height_;
}
Screen* Screen::getInstance(int width = 640, int height = 480)
{
if (!instance)
{
instance = new Screen(width,height);
}
return instance;
}
void Screen::deleteInstance()
{
delete instance;
instance = 0;
}
Screen::~Screen()
{
cout << leave << endl;
}
void Screen::exitWhenInvalidScreen(int width, int height)
{
if (width <= 0 || height <= 0)
{
cout << "invalid screen size";
exit(0);
}
if (width > 1000 || height > 1000)
{
cout << "invalid screen size";
exit(0);
}
}
/*Screen::Screen() :width_(640), height_(480),
enter("enter screen"),leave("leave screen")
{
cout << enter << endl;
}*/
Screen::Screen(int width, int height)//将Screen类中的所有构造函数都变成 private 成员
{
width_ = width;
height_ = height;
enter = "enter screen";
leave = "leave screen";
cout << enter << endl;
exitWhenInvalidScreen(width, height);//检测屏幕的宽与高是否 符合逻辑
}
class MyRectangle
{
private:
int x1_, y1_, x2_, y2_;
int R_, G_, B_;
Screen* screen_;
int getWidth()
{
return x2_ - x1_;
}
int getHeight()
{
return y2_ - y1_;
}
public:
MyRectangle(int x1, int y1, int x2, int y2, Screen* screen):x1_(x1),y1_(y1),x2_(x2),y2_(y2),
screen_(screen),R_(255),G_(255),B_(255)
{
cout << "myrectangle" << endl;
}
MyRectangle():x1_(10),y1_(10),x2_(100),y2_(100),screen_(0),
R_(255),G_(255),B_(255)
{
cout << "myrectangle" << endl;
}
void setCoordinations(int x1, int y1, int x2, int y2) {
x1_ = x1;
y1_ = y1;
x2_ = x2;
y2_ = y2;
}
void setScreen(Screen& screen) {
screen_ = &screen;
}
void Draw() {
cout << x1_ << " " << y1_ << " " <<
getWidth() << " " <<
getHeight() << endl;
cout << R_ << " " << G_ << " " << B_ << endl;
}
void setColor(int R, int G, int B)
{
R_ = R;
G_ = G;
B_ = B;
}
void showScreen()
{
cout << screen_->getWidth() << " " << screen_->getHeight() << endl;
}
};
class MyCircle
{
public:
void setColor(int R, int G, int B);
void setCenter(int x, int y);
void setRadius(int r);
void Draw();
void showScreen();
void setScreen(Screen& screen);
MyCircle(int centerX, int centerY, int radius, Screen* screen);
MyCircle();
MyCircle(const MyCircle&);
private:
int Red_;
int Green_;
int Blue_;
Screen* screen_;
int centerX_;
int centerY_;
int radius_;
};
void MyCircle::setColor(int R, int G, int B)
{
Red_ = R;
Green_ = G;
Blue_ = B;
}
void MyCircle::setCenter(int x, int y)
{
centerX_ = x;
centerY_ = y;
}
void MyCircle::setRadius(int r)
{
radius_ = r;
}
void MyCircle::Draw()
{
cout << centerX_ << " " << centerY_ << " " << radius_ << endl;
cout << Red_ << " " << Green_ << " " << Blue_ << endl;
}
void MyCircle::showScreen()
{
cout << screen_->getWidth() << " " << screen_->getHeight() << endl;
}
void MyCircle::setScreen(Screen& screen)
{
screen_ = &screen;
}
MyCircle::MyCircle(int centerX, int centerY, int radius, Screen* screen):centerX_(centerX),centerY_(centerY),
radius_(radius),screen_(screen),Red_(255),Green_(255),Blue_(255)
{
cout << "mycircle" << endl;
}
MyCircle::MyCircle():centerX_(200),centerY_(200),radius_(100),
Red_(255),Green_(255),Blue_(255)
{
cout << "mycircle" << endl;
}
//拷贝构造函数
MyCircle::MyCircle(const MyCircle&rCircle):centerX_(rCircle.centerX_),
centerY_(rCircle.centerY_),radius_(rCircle.radius_),Red_(rCircle.Red_),
Green_(rCircle.Green_),Blue_(rCircle.Blue_),screen_(rCircle.screen_)
{
cout << "copy mycircle" << endl;
}
Screen* Screen::instance;
int main() {
int width, height;
cin >> width >> height;
int leftX, leftY, rightX, rightY;
cin >> leftX >> leftY >> rightX >> rightY;
int centerX, centerY, radius;
cin >> centerX >> centerY >> radius;
Screen *screen = Screen::getInstance(width, height);
MyRectangle myRectangle(leftX, leftY, rightX, rightY, screen);
myRectangle.setColor(0, 0, 0xff);
myRectangle.showScreen();
myRectangle.Draw();
// 构造圆形对象数组
//// 第一个元素使用匿名对象(调用带参构造函数)初始化
//// 第二个元素使用匿名对象(调用默认构造函数)初始化
MyCircle myCircles[2] = { MyCircle(centerX, centerY, radius, screen) };
// 设置对象数组中第二个元素的属性。注意访问成员函数的不同方法
(myCircles + 1)->setCenter(centerX + 10, centerY + 20);
myCircles[1].setRadius(radius + 30);
(*(myCircles + 1)).setColor(0x00, 0x00, 0x00);
myCircles[1].setScreen(*screen);
for (int i = 0; i <= 1; i++) {
myCircles[i].showScreen();
(myCircles + i)->Draw();
}
// 调用拷贝构造函数以myCircles数组中的第二个元素为模板创建新对象
MyCircle yourCircle(myCircles[1]);
yourCircle.showScreen();
(&yourCircle)->Draw();
screen->deleteInstance();
#ifdef DEBUG
std::cin.get();
#endif
return 0;
}