C++屏幕类,矩形类,圆类小练习

1

增强Screen类,使之在程序中只能生成一个实例 增强MyRectangle类,添加颜色信息 创建MyCircle类 在main函数中创建类的实例。(20分)

题目内容:

修改Screen类:

  1. 在Screen类中,将保存屏幕宽和高的数据域成员改为 static int 类型。

  2. 在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”

  3. 在Screen类中,增加一个 Screen* 类型的静态的私有数据成员 instance;

  4. 在Screen类中,增加一个静态公有的 getInstance(int width, int height) 函数,该函数返回instance的值。两个参数均带有默认值,分别为 640 和 480

  5. 在getInstance函数中,判断instance的值,若为0,则设置屏幕的高和宽,然后创建一个存放在堆区的Screen对象,将地址保存在instance中;若instance的值不为0,则返回instance的值

  6. 在getInstance函数中,如果需要创建Screen对象,则校验宽和高的值;如果宽与高超过1000,或者其它不合理的设置则用cout输出“invalid screen size”,然后结束程序

  7. 在Screen类中,添加一个deleteInstance()函数(函数类型自行根据main()中的代码确定),将getInstance()函数中申请的内存归还给操作系统。

    扫描二维码关注公众号,回复: 3463474 查看本文章
  8. 在Screen类中,添加一个拷贝构造函数;

  9. Screen类的默认构造函数将屏幕宽和高分别设置为640和480

  10. Screen类的所有构造函数均应输出字符串enter的内容并换行

  11. 为screen类添加析构函数,在其中应输出字符串leave的内容并换行

  12. 删除Screen类中的带参构造函数

  13. 将Screen类中所有的构造函数都变成 private 成员

  14. 如有必要,则增加或者修改其他数据成员及函数成员,例如数据域成员的getter与setter函数

  15. 不要忘记在类外对Screen类的所有静态成员进行初始化,否则编译器会报告链接出错。

  • 补充说明:现在的Screen类使用了一种【设计模式】,叫做“单例模式”,可以保证在这个程序中只会有一个Screen的实例。

修改MyRectangle类:

  1. 在MyRectangle类中,增加表示颜色的数据域成员;

  2. 在MyRectangle类中,增加函数 setColor(int R, int G, int B);该函数接收三个参数,代表颜色中的Red、Green、Blue分量的大小,该函数将颜色保存在类的数据域成员中。

  3. MyRectangle类的构造函数1接受4个整型参数

  4. 按照顺序,这4整型参数分别为矩形的左上顶点的x、y坐标,以及右下顶点的x、y坐标。(此处不做坐标有效性检查)

  5. MyRectangle类的默认构造函数将矩形左上角顶点的坐标均设置为(10,10),将右下角定点坐标设置为(100,100)

  6. MyRectangle类的所有构造函数均将表示颜色的数据成员初始化为白色,也就是RGB三个颜色分量的值均为255

  7. MyRectangle类的所有构造函数均应使用cout输出字符串“myrectangle”并换行

  8. MyRectangle类中应提供setCoordinations()用于设置对角线的左侧及右侧顶点坐标;函数的参数的含义及类型和构造函数1的前4个参数相同。

  9. MyRectangle类的Draw()函数不再检查坐标的有效性,也不输出关于坐标无效的信息

  10. 在Draw()中用cout输出:
    b. 矩形的左上顶点的x、y坐标以及矩形的宽度和高度(坐标值以及宽高等4个数值间以1个空格分隔)然后换行;
    c. 矩形的颜色的RGB分量的值,用空格分隔开的三个整数,然后换行

  11. 如有必要,则增加其他数据成员及函数成员

  12. 不要输出任何未要求输出的信息,不然会导致系统扣分。

新增MyCircle类:

  1. 在MyCircle类中,增加表示颜色的数据域成员;

  2. 在MyCircle类中,增加函数 setColor(int R, int G, int B);该函数接收三个参数,代表颜色中的Red、Green、Blue分量的大小,该函数将颜色保存在类的数据域成员中。

  3. MyCircle类的构造函数1接受3个整型参数

  4. 按照顺序,整型参数分别为圆心的x、y坐标,以及圆的半径。(此处不检查坐标及半径的有效性)

  5. MyCircle类的默认构造函数将圆心的坐标设置为(200,200),半径设置为100

  6. MyCircle类的“构造函数1”与默认构造函数均将表示颜色的数据成员初始化为白色,也就是RGB三个颜色分量的值均为255

  7. 为MyCircle类添加拷贝构造函数

  8. MyCircle类的所有非拷贝构造函数均应使用cout输出字符串“mycircle”并换行

  9. MyCircle类中应提供setCenter(int x, int y)用于设置圆心坐标,提供setRadius(int r)用于设置圆的半径。

  10. 在Draw()中用cout输出:

  11. a. 屏幕的宽度和高度,以空格分隔,然后换行;
    b. 圆心的x、y坐标以及半径(坐标值以及半径等3个数值间以1个空格分隔)然后换行;
    c. 圆的颜色的RGB分量的值,用空格分隔开的三个整数,然后换行

  12. 如有必要,则增加其他数据成员及函数成员

  13. 不要输出任何未要求输出的信息,不然会导致系统扣分。

 

main() 函数:

需使用如下main()函数(不得更改)

 

  1. int main() {
  2.   int width, height;
  3.   cin >> width >> height;
  4.   Screen::getInstance(width, height);
  5.   Screen::getInstance();
  6.    
  7.   int leftX, leftY, rightX, rightY;
  8.   cin >> leftX >> leftY >> rightX >> rightY;
  9.   MyRectangle myRectangle(leftX, leftY, rightX, rightY);
  10.   myRectangle.setColor(0, 0, 0xff);
  11.   myRectangle.Draw();
  12.  
  13.   int centerX, centerY, radius;
  14.   cin >> centerX >> centerY >> radius;
  15.   MyCircle myCircles[2];
  16.   (myCircles + 1)->setCenter(centerX, centerY);
  17.   myCircles[1].setRadius(radius);
  18.   myCircles[0].Draw();
  19.   myCircles[1].Draw();
  20.   
  21.   MyCircle myCircle(myCircles[1]);
  22.   myCircle.Draw();
  23.    
  24.   Screen::deleteInstance();
  25.    
  26.   cin.get();
  27.   return 0;
  28. }

输入格式:

空格分隔的整数

输出格式:

字符串或者空格分隔的整数

 

输入样例:

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;
}

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/82953116