1. 程式人生 > >C++ 單例設計模式螢幕類練習

C++ 單例設計模式螢幕類練習

第7單元 - 單元作業第1題說明 (線上程式設計)

題目內容:

以單例模式建立一個螢幕Screen物件。

輸入格式:

用空格分開的兩個整數,代表螢幕解析度

輸出格式:

用空格分開的兩個整數,代表螢幕解析度。隨後有換行符

輸入樣例:

800 600

輸出樣例:

800 600

具體要求:

請將如下程式碼中的缺失部分補全:

  1. 補全Screen類中的資料域成員,給出適當的資料型別

    a. 代表螢幕寬和高的資料域成員

    b. 儲存單例物件地址的一個指標資料成員 instance

    c. 注意資料域成員是否應該使用 static 關鍵字修飾

  2. 補充getWidth與getHeight函式

  3. 補全getInstance的函式體

  4. 補充Screen類的特殊資料成員初始化語句

對於getInstance函式,是單例模式的核心函式。關於單例模式及其示例程式碼,可以參見百度百科【單例模式】。 getInstance函式體主要流程為:

  1. 判斷 instance 資料域成員是否指向一個 Screen 物件;

  2. 若 instance 未指向有效的 Screen 物件,則設定螢幕的高和寬;

  3. 然後建立一個 Screen 物件(使用 new 運算子),將該物件地址存入 instance

程式碼

#include <iostream>
#include <limits>

using namespace std;

class Screen {
private:
	//----補充多個數據域成員
	unsigned int width;
	unsigned int height;
	static Screen *instance;
	// 在Screen類中獲取/釋放圖形視窗資源,是一種RAII方法
	//   關於RAII,可以參見異常處理單元的材料
	Screen():width(800),height(600)
	{
		// 如果啟用了圖形庫,則將初始化圖形模式的函式置於此處
		// initgraph(width_, height_);
	};
	~Screen() {
		// 如果啟用了圖形庫,則將關閉圖形模式的函式置於此處
		// closegraph();
		delete instance;
	}

public:
	//----補充 getWidth() 與 getHeight() 函式,
	unsigned int getWidth()
	{
		return width;
	}

	unsigned int getHeight()
	{
		return height;
	}
	static Screen* getInstance(unsigned int width = 640, unsigned int height = 480) 
	{
		// 單例模式
		//----補充函式體
		if (instance == 0)
		{
			instance = new Screen;
			instance->width = width;
			instance->height = height;
		}
		return instance;
	}
};

Screen* Screen::instance = 0;
//----補充Screen類的特殊資料成員初始化語句

int main() {
	int width, height;
	Screen* screen = 0;

	cin >> width >> height;
	screen = Screen::getInstance(width, height);
	screen = Screen::getInstance();

	cout << screen->getWidth() << " " <<
		screen->getHeight() << endl;

	// GCC及VC編譯器在除錯模式下會暫停,便於檢視執行結果
#if ( defined(__DEBUG__) || defined(_DEBUG) )
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	cin.get();
#endif

	return 0;
}