試想一下, 有沒有這種需求:
對於每乙個新的物件, 我們希望它能夠在一定時間後自動銷毀, 前提是我們沒有在這段時間內給它發出重置訊號.這種需求其實是有的, 比如在電影裡, 主角知道了乙個反派不希望被揭露的秘密, 同時需要保住自己的性命, 那麼就可以構造這樣乙個物件, 如果24小時內主角不給這個物件傳送重置的訊號, 它就會將這個秘密公之於眾. 再比如, 在網路應用場景裡, 我們希望每乙個客戶端能夠定時給我們傳送心跳包, 如果長時間不傳送的話, 我們就剔除這個客戶.
在之前的文章裡, 我嘗試使用了win32的timer, 但是發現這種做法非常繁瑣且容易出錯, 你需要給每個物件繫結乙個timer, 同時需要在timer到期時處理物件, 並且重置timer的api和設定timer的api是同乙個, 稍有不慎就會搞砸.
現在, 我想出了一種相對簡單的實現方式, 雖然精度不是非常理想, 但對於一般應用而言, 足矣.
我們構造乙個類, 它有一些私有的資料, 這些可以自定義, 但有一些api是必須的:
classclient
1. 建構函式:
client:client(int32_t life, dword thread_id)
第二個引數是用來銷毀物件的執行緒id, 這樣設計是考慮到物件有可能儲存在乙個堆, 如果我們簡單地呼叫析構函式, 那麼物件本身所佔據的空間就無法被釋放了, 所以我們通知這麼乙個執行緒來完成所有的析構操作.
注意到我們使用的是countdownentry()而不是countdown(), 因為createthread不接受乙個非靜態的成員函式作為函式入口(無法確認位址).
2. reset()方法, 這方法需要先掛起倒計時的執行緒, 主要是防止同時訪問同乙個記憶體的情況出現:
void client::reset(void)
3. countdownentry()方法為何是static的? 很簡單, 我們需要在建構函式裡使用它來初始化倒計時執行緒, 而它的實現非常簡單, 我們在建構函式裡把this指標傳遞給這個靜態方法, 並在靜態方法裡重新獲取這個this代表的物件, 呼叫這個物件的倒計時函式即可:
static win32api dword client::countdownentry(void *pm)
4. 而countdown()方法更加簡單, 使用sleep函式來計時即可, 每計一秒就將life減1:
dword client::countdown()postthreadmessagea(delete_thread_id);
return0;
}
以上就是這樣乙個物件的設計思路, 原理比較簡單, 也只是寫了個大概, 同時需要windows.h的支援.
乙個簡單位的C 類實現
這個例子的編譯環境是vc 6.0,所以每個cpp檔案都要帶頭檔案為 include stdafx.h 這個例子共用到3個檔案,乙個標頭檔案,乙個原始檔,乙個main檔案。如下所示 test.h ifndef fraction h define fraction h include using nam...
C 實現乙個日期類
include using namespace std class date public bool is invalid date 判斷日期是否無效 return false public int day in month if is leap year return days month pub...
C 實現乙個Date類
關於日期類,我們最基本的成員變數就是三個 年 月 日。關於成員函式我們要實現構造,拷貝構造,賦值,關於日期的比較大小,以及日期加天數,日期減天數,以及 和 同時還要考慮能否復用,日期減日期,還有日期類的 和 分為前置和後置 等。具體 如下 詳情請看 注釋 date.h pragma once inc...