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


     

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

    �返回
     

    温馨提示:

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

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

    增强Screen类,使之在程序中只能生成一个实例

    也就是要学习【设计模式】中的【单例模式】

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

    1
    增强Screen类,使之在程序中只能生成一个实例(10分)

    题目内容:

    基于第四单元作业【2】或者作业【3】,只修改其中的Screen类

    如果基于第四单元作业【3】修改,请将所有MyRectangle类的相关代码删掉,避免无意间的副作用

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

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

    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的值

    5. 在getInstance函数中,不检查宽和高是否合理。合理性检测仍然由Screen类的构造函数负责

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

    7. 如有必要,则增加或者修改其他数据成员及函数成员

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

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

    • 在本作业中,我们完成了单例模式的70%。在下一个作业中将全部完成它

    程序所用主函数如下(不可做任何修改!)

    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.    
    10.   std::cout << screen1->getWidth() << ' ' << screen1->getHeight() << std::endl;
    11.   std::cout << screen2->getWidth() << ' ' << screen2->getHeight();
    12.    
    13. #ifdef DEBUG
    14.   std::cin.get();
    15. #endif
    16.   return 0;
    17. }

    输入格式:

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

    输出格式:

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

    输入样例:

    800 600

    输出样例:

    enter screen

    800 600

    800 600

    注:上述输出样例第三行之后没有换行符

    时间限制:500ms内存限制:32000kb
     
    #include <iostream>
    #include <string>
    
    class Screen
    {
    public:
    	int getWidth();
    	int getHeight();
    	int setWidth(int width);    //return width
    	int setHeight(int height);  //return height
    public:
    	static Screen* getInstance(int width, int height);//3.在Screen类中,增加一个静态公有的 getInstance(int width, int height) 函数,该函数返回instance的值。两个参数均带有默认值,分别为 640 和 480
    	Screen(int width, int height);//有参构造函数
    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);//检测屏幕的宽与高是否 符合逻辑
    };
    
    int Screen::getWidth()
    {
    	return width_;
    }
    
    int Screen::getHeight()
    {
    	return height_;
    }
    
    int Screen::setWidth(int width)    //return width
    {
    	width_ = width;
    	return width;
    }
    
    int Screen::setHeight(int height)  //return height
    {
    	height_ = height;
    	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;
    }
    
    Screen::Screen(int width, int height)//有参构造函数
    {
    	//修改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);//检测屏幕的宽与高是否 符合逻辑
    }
    
    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::instance;//8.不要忘记在类外对Screen类的所有静态成员进行初始化,否则编译器会报告链接出错。
    
    int main() {
    	int width, height;
    	Screen *screen1, *screen2;
    
    	std::cin >> width >> height;
    
    	screen1 = Screen::getInstance(width, height);
    	screen2 = Screen::getInstance();
    
    	std::cout << screen1->getWidth() << ' ' << screen1->getHeight() << std::endl;
    	std::cout << screen2->getWidth() << ' ' << screen2->getHeight();
    
    #ifdef DEBUG
    	std::cin.get();
    #endif
    	return 0;
    }
    
  • 相关阅读:
    滚动计算基础知识
    Javascript继承
    提取URL字符串的搜索字符串中的参数
    C++编程练习(13)----“排序算法 之 堆排序“
    常见网络端口 和 常见网络协议
    TCP协议中的三次握手和四次挥手(图解)
    C++编程练习(14)-------“单例模式”的实现
    编程练习------C/C++分别实现字符串与整数的转换
    IPv4地址学习总结
    C/C++中的联合体
  • 原文地址:https://www.cnblogs.com/denggelin/p/5908756.html
Copyright © 2020-2023  润新知