我定義一個變量:C++確定是否變量設置
SYSTEMTIME m_TOTime;
我呼籲GetSystemTime函數獲取UTC時間:
GetSystemTime(&m_TOTime);
是否有可能以確定是否GetSystemTime已被調用來設置m_TOTime?我有另一個使用這個變量的函數,但是如果GetSystemTime沒有被調用(有時它不必),它返回一個空白對象。我希望像m_TOTime == null這樣的東西可以工作。
我定義一個變量:C++確定是否變量設置
SYSTEMTIME m_TOTime;
我呼籲GetSystemTime函數獲取UTC時間:
GetSystemTime(&m_TOTime);
是否有可能以確定是否GetSystemTime已被調用來設置m_TOTime?我有另一個使用這個變量的函數,但是如果GetSystemTime沒有被調用(有時它不必),它返回一個空白對象。我希望像m_TOTime == null這樣的東西可以工作。
使用初始值設定項。
SYSTEMTIME m_TOTime = { 0 }; // Initialize structure to zero
...
if (m_TOTime.wYear != 0)
// structure has been initialized
一般情況下,你不能這樣做,如果變量的所有可能的值是「合法」的,但假設時間旅行是不可能的,今年絕不會GetSystemTime後爲零()被調用。
如果所有可能的值都是合法的,則需要使用輔助「bool m_TOTime_initialized = false」變量或somesuch。
你應該用一個不能是GetSystemTime
的調用結果的值初始化它。最可能的值爲0應該能夠完成這項工作 - 通常系統時間是從過去的任意時刻算起的,比如1970年1月1日00:00:00,這是不會再發生的:-)而且計數器可能會在未來某個時候環繞,但它應該發生在相當遙遠的未來,如2038 *。在此之前,您可能會安全:-)
*確切的細節是特定於OS的。
您可以分配變量一些魔術值。例如,
SYSTEMTIME m_TOTime = {0}; // This should set all struct to 0
然後你可以檢查它是否GetSystemTime
被稱爲像這樣:
if (m_TOTime.wYear != 0) {
// we have set the value with the GetSystemTime call
}
當然,你可以選擇比0
別的東西之外,例如-1
或保證值不會被GetSystemTime
返回。
或者,你可以有一個布爾標誌,將告訴你,如果變量被設置:
SYSTEMTIME m_TOTime;
bool m_TOTime_set = false;
...
GetSystemTime(m_TOTime);
m_TOTime_set = true;
...
if (m_TOTime_set) {
// do stuff here
}
另一種方法,在建設初始化類包裝它:
class clock
{
public:
clock()
{
system();
}
void system()
{
GetSystemTime(&time_);
}
void local()
{
GetLocalTime(&time_);
}
const SYSTEMTIME& get() const
{
return time_;
}
private:
SYSTEMTIME time_;
};
它可能是矯枉過正的,但是你可以避免出現epoch包裝的問題(假設GetBlahTime在未來會被適當地改變),你可以進一步去包裝SYSTEMTIME的所有參數,然後你可以選擇不同的時間實現平臺或其他任何東西,最後你可以編寫操作符/方法爲你做一些常見的事情(時間比較,增量時間,秒錶等)。
SYSTEMTIME是一個不是指針的結構。 – Adam 2011-05-24 22:04:37
是的,只是查閱了文檔。修復了迴應。 – evgeny 2011-05-24 22:11:24