C++ 單例設計模式螢幕類練習
阿新 • • 發佈:2018-12-14
第7單元 - 單元作業第1題說明 (線上程式設計)
題目內容:
以單例模式建立一個螢幕Screen物件。
輸入格式:
用空格分開的兩個整數,代表螢幕解析度
輸出格式:
用空格分開的兩個整數,代表螢幕解析度。隨後有換行符
輸入樣例:
800 600
輸出樣例:
800 600
具體要求:
請將如下程式碼中的缺失部分補全:
-
補全Screen類中的資料域成員,給出適當的資料型別
a. 代表螢幕寬和高的資料域成員
b. 儲存單例物件地址的一個指標資料成員 instance
c. 注意資料域成員是否應該使用 static 關鍵字修飾
-
補充getWidth與getHeight函式
-
補全getInstance的函式體
-
補充Screen類的特殊資料成員初始化語句
對於getInstance函式,是單例模式的核心函式。關於單例模式及其示例程式碼,可以參見百度百科【單例模式】。 getInstance函式體主要流程為:
-
判斷 instance 資料域成員是否指向一個 Screen 物件;
-
若 instance 未指向有效的 Screen 物件,則設定螢幕的高和寬;
-
然後建立一個 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; }