2011-05-24 68 views
2

我定義一個變量:C++確定是否變量設置

SYSTEMTIME m_TOTime; 

我呼籲GetSystemTime函數獲取UTC時間:

GetSystemTime(&m_TOTime); 

是否有可能以確定是否GetSystemTime已被調用來設置m_TOTime?我有另一個使用這個變量的函數,但是如果GetSystemTime沒有被調用(有時它不必),它返回一個空白對象。我希望像m_TOTime == null這樣的東西可以工作。

回答

8

使用初始值設定項。

SYSTEMTIME m_TOTime = { 0 }; // Initialize structure to zero 

... 

if (m_TOTime.wYear != 0) 
    // structure has been initialized 

一般情況下,你不能這樣做,如果變量的所有可能的值是「合法」的,但假設時間旅行是不可能的,今年絕不會GetSystemTime後爲零()被調用。

如果所有可能的值都是合法的,則需要使用輔助「bool m_TOTime_initialized = false」變量或somesuch。

1

你應該用一個不能是GetSystemTime的調用結果的值初始化它。最可能的值爲0應該能夠完成這項工作 - 通常系統時間是從過去的任意時刻算起的,比如1970年1月1日00:00:00,這是不會再發生的:-)而且計數器可能會在未來某個時候環繞,但它應該發生在相當遙遠的未來,如2038 *。在此之前,您可能會安全:-)

*確切的細節是特定於OS的。

1

您可以分配變量一些魔術值。例如,

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 
} 
+1

SYSTEMTIME是一個不是指針的結構。 – Adam 2011-05-24 22:04:37

+0

是的,只是查閱了文檔。修復了迴應。 – evgeny 2011-05-24 22:11:24

1

另一種方法,在建設初始化類包裝它:

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的所有參數,然後你可以選擇不同的時間實現平臺或其他任何東西,最後你可以編寫操作符/方法爲你做一些常見的事情(時間比較,增量時間,秒錶等)。