基于本单元的作业3,修改Screen类,添加析构函数;同时补充deleteInstance()函数,能够删除在createInstance()中创建的Screen对象;完成单例模式练习(10分)
题目内容:
修改本单元作业 3 中的Screen类
- 为Screen类添加析构函数
-
析构函数应首先输出数据成员leave的内容并换行(使用std::endl)
-
然后再执行其他必要的操作(如果有的话)
- 在Screen类中,添加一个deleteInstance()函数
-
函数类型自行根据main()中的代码确定
-
功能:将getInstance()函数中申请的内存归还给操作系统。
-
将数据成员instance设置为空指针nullptr
- 处理Screen类的构造函数
1) 将无参构造函数删除(使用C++11的delete声明方法)
2) 将其它构造函数都变成 private 成员
-
删除Screen类中的所有setter函数
-
保留屏幕宽高的合法性检测
程序的主函数如下
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;
}
注意:要小心使用delete这个运算符,不要用错地方,否则你的程序可能会崩溃
输入格式:
空格分隔的两个整数,代表屏幕的宽和高
输出格式:
依据输入的数据不同,输出的内容、行数均有变化
输入样例:
480 320
输出样例:
enter screen
480 320
leave screen
enter screen
960 640
leave screen
注:一共有7行输出,第7行是空行
#include <iostream>
#include <string>
class Screen
{
public:
Screen(int Width,int Height)
{
this -> Width = Width;
this -> Height = Height;
std::cout << this -> enter << std::endl;
this -> exitWhenInvalidScreen(this -> Width,this -> Height);
}
~Screen()
{
std::cout << this -> leave << std::endl;
}
int getWidth()
{
return Width;
}
int getHeight()
{
return this->Height;
}
static Screen *getInstance(int width = 640, int height = 480)
{
if(instance == nullptr)
instance = new Screen(width, height);
return instance;
}
static Screen *deleteInstance()
{
if(instance != nullptr)
{
delete instance;
instance = nullptr;
}
return instance;
}
private:
static Screen * instance;
std::string enter{"enter screen"}, leave{"leave screen"};
int Width{640},Height{480};
void exitWhenInvalidScreen(int w,int h)
{
if(w > 0 && h > 0 && w <= 1000 && h <= 1000)
return;
else
{
std::cout << "invalid screen size";
exit(0);
}
}
};
Screen * Screen::instance = nullptr;
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;
}