网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【2】

 

第5单元作业【2】 - 在线编程(难度:易)

�返回
 

温馨提示:

1.本次作业属于Online Judge题目,提交后由系统即时判分。

2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩。

基于单元5的作业【1】,修改Screen类,完成单例模式练习

依照学术诚信条款,我保证此作业是本人独立完成的。

1
基于单元5的作业【1】,修改Screen类,完成单例模式练习(10分)

题目内容:

 

修改本单元作业【1】中的Screen类

 

  1. 为Screen类添加析构函数

    • 析构函数应首先输出数据成员leave的内容并换行(使用std::endl)

    • 然后再执行其他必要的操作(如果有的话)

  2. 在Screen类中,添加一个deleteInstance()函数

    • 函数类型自行根据main()中的代码确定

    • 功能:将getInstance()函数中申请的内存归还给操作系统。

    • 将数据成员instance设置为空指针

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

  4. 删除Screen类中的所有setter函数

  5. 保留屏幕宽高的合法性检测

 

程序的主函数如下

 

  1. int main() {
  2.   int width, height;
  3.   Screen *screen1, *screen2;
  4.  
  5.   std::cin >> width >> height;
  6.    
  7.   screen1 = Screen::getInstance(width, height);
  8.   screen2 = Screen::getInstance();
  9.   if (screen1 != screen2 ) {
  10.       std::cout << "two instances" << std::endl;
  11.   }
  12.  
  13.   std::cout << screen2->getWidth() << ' ' << screen2->getHeight() << std::endl;
  14.   screen2->deleteInstance();
  15.    
  16.   screen1 = Screen::getInstance(2*width, 2*height);
  17.   std::cout << screen1->getWidth() << ' ' << screen1->getHeight() << std::endl;
  18.   screen1->deleteInstance();
  19.    
  20. #ifdef DEBUG
  21.   std::cin.get();
  22. #endif
  23.   return 0;
  24. }

 

注意:要小心使用delete这个运算符,不要用错地方,否则你的程序可能会崩溃

 

输入格式:

空格分隔的两个整数,代表屏幕的宽和高

 

输出格式:

依据输入的数据不同,输出的内容、行数均有变化

 

输入样例:

 

480 320

 

输出样例:

 

enter screen
480 320
leave screen
enter screen
960 640
leave screen

 

注:一共有7行输出,第7行是空行

时间限制:500ms内存限制:32000kb
 
#include <iostream>
#include <string>

class Screen
{
public:
	int getWidth();
	int getHeight();
public:
	static Screen* getInstance(int width, int height);//3.在Screen类中,增加一个静态公有的 getInstance(int width, int height) 函数,该函数返回instance的值。两个参数均带有默认值,分别为 640 和 480
	void deleteInstance();//2.在Screen类中,添加一个deleteInstance()函数
	~Screen();//1.为Screen类添加析构函数
private:
	int width_;//屏幕的宽
	int height_;//屏幕的高
	std::string enter;//1.在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”(每个字符串中只有一个空格分隔两个单词)
	std::string leave;//1.在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”(每个字符串中只有一个空格分隔两个单词)
	static Screen* instance;//2.在Screen类中,增加一个 Screen* 类型的静态的私有数据成员 instance;
private:
	void exitWhenInvalidScreen(int width, int height);//检测屏幕的宽与高是否 符合逻辑
	Screen(int width, int height);//将Screen类中的所有构造函数都变成 private 成员
};

int Screen::getWidth()
{
	return width_;
}

int Screen::getHeight()
{
	return height_;
}

Screen* Screen::getInstance(int width = 640, int height = 480)//3.在Screen类中,增加一个静态公有的 getInstance(int width, int height) 函数,该函数返回instance的值。两个参数均带有默认值,分别为 640 和 480
{
	//4.在getInstance函数中,判断instance的值
	//	1) 若instance值为0(即“instance是一个空指针”)
	//	a.以width和height作为构造函数的参数,使用new运算符创建一个Screen对象
	//	b.将新的Screen对象的地址保存在instance中;
	//	2) 若instance的值不为0(即instance指向一个Screen对象),则返回instance的值

	if (!instance)
	{
		instance = new Screen(width, height);

	}

	return instance;
}

void Screen::deleteInstance()//2.在Screen类中,添加一个deleteInstance()函数
{
	delete instance;//功能:将getInstance()函数中申请的内存归还给操作系统。
	instance = 0;//将数据成员instance设置为空指针
}

Screen::~Screen()//1.为Screen类添加析构函数
{
	std::cout << leave << std::endl;//析构函数应首先输出数据成员leave的内容并换行(使用std::endl)
}

void Screen::exitWhenInvalidScreen(int width, int height)//检测屏幕的宽与高是否 符合逻辑
{
	if (width <= 0 || height <= 0)//宽度和高度必须大于0像素(不能等于0像素)
	{
		std::cout << "invalid screen size";//如果宽或者高不满足上述任一条件,则整个程序仅仅输出字符串"invalid screen size",然后退出程序
		exit(0);
	}

	if (width > 1000 || height > 1000)//宽度和高度均不得大于1000像素(可以等于1000像素)
	{
		std::cout << "invalid screen size";
		exit(0);
	}
}

Screen::Screen(int width, int height)//将Screen类中的所有构造函数都变成 private 成员
{
	//修改Screen类的构造函数
	//	1) 删除Screen类的默认构造函数,只保留带参构造函数,并修改之使其能初始化数据成员
	//	2) 删除第4单元作业的Screen类的所有构造函数中的【cout << "screen" << endl; 】语句
	//	3) Screen类的所有构造函数【均应输出】数据成员enter中的字符串内容并换行(使用std::endl),但是【不再输出其它信息】
	//	4) Screen类的构造函数仍然使用第四单元作业中所要求的exitWhenInvalidScreen函数检查屏幕宽和高的有效性。(可以直接复用第四单元作业的相关代码);该部分代码必须放在输出数据成员enter的代码之后

	width_ = width;
	height_ = height;
	enter = "enter screen";//1.在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”(每个字符串中只有一个空格分隔两个单词)
	leave = "leave screen";//1.在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”(每个字符串中只有一个空格分隔两个单词)

	std::cout << enter << std::endl;

	exitWhenInvalidScreen(width, height);//检测屏幕的宽与高是否 符合逻辑
}

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

int main() {
	int width, height;
	Screen *screen1, *screen2;

	std::cin >> width >> height;

	screen1 = Screen::getInstance(width, height);
	screen2 = Screen::getInstance();
	if (screen1 != screen2) {
		std::cout << "two instances" << std::endl;
	}

	std::cout << screen2->getWidth() << ' ' << screen2->getHeight() << std::endl;
	screen2->deleteInstance();

	screen1 = Screen::getInstance(2 * width, 2 * height);
	std::cout << screen1->getWidth() << ' ' << screen1->getHeight() << std::endl;
	screen1->deleteInstance();

#ifdef DEBUG
	std::cin.get();
#endif
	return 0;
}
原文地址:https://www.cnblogs.com/denggelin/p/5909602.html