C ++确定是否设置了变量

时间:2011-05-24 21:57:07

标签: c++

我有一个定义的变量:

SYSTEMTIME m_TOTime;

我调用GetSystemTime函数来获取UTC时间:

GetSystemTime( &m_TOTime );

是否可以确定是否已调用GetSystemTime来设置m_TOTime?我有另一个使用此变量的函数,但如果没有调用GetSystemTime(有时它不一定),则返回一个空白对象。我希望像m_TOTime == null之类的东西能起作用。

4 个答案:

答案 0 :(得分:8)

使用初始化程序。

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

...

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

一般情况下,如果变量的所有可能值都是“合法的”,则不能这样做,但假设时间旅行是不可能的,那么在调用GetSystemTime()之后年份永远不会为零。

如果所有可能的值都合法,则需要使用辅助“bool m_TOTime_initialized = false”变量或其他类似的值。

答案 1 :(得分:1)

您应该使用一个不能通过调用GetSystemTime的结果来初始化它。最有可能的值是0应该完成工作 - 通常系统时间从过去的任意时刻开始计算,如1970年1月1日00:00:00,这不会再发生:-)和计数器可能会在将来的某个时候结束,但它应该发生在相当遥远的未来,如2038 *。在那之前,你可能是安全的: - )

*具体细节是特定的。

答案 2 :(得分: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以外的其他内容,例如-1GetSystemTime保证不会返回的值。

或者,您可以使用布尔标志来告诉您变量是否已设置:

SYSTEMTIME m_TOTime;
bool m_TOTime_set = false;
...
GetSystemTime(m_TOTime);
m_TOTime_set = true;
...
if (m_TOTime_set) {
    // do stuff here
}

答案 3 :(得分: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的所有参数,然后你可以选择一个不同的时间不同平台或其他任何平台的实现,最后你可以编写为你做常见事情的操作符/方法(时间比较,增量时间,秒表等)。