在类中初始化静态struct tm

时间:2010-01-20 21:24:22

标签: c++ class static struct ctime

我想将tm结构用作类中的静态变量。花了一整天阅读和尝试,但它仍然无法工作:(如果有人可以指出我做错了,将不胜感激

在我的班级中,在Public下,我已将其声明为:

static struct tm *dataTime;

在main.cpp中,我试图用系统时间来定义和初始化它以进行测试(在运行时输入的实际时间)

time_t rawTime;
time ( &rawTime );
tm Indice::dataTime = localtime(&rawTime);

但似乎我不能在函数外使用time()。

  

main.cpp:28:错误:预期   构造函数,析构函数或类型   '''令牌

之前的转换

如何在类的静态tm中初始化值?

6 个答案:

答案 0 :(得分:7)

您可以将上述内容包含在函数中:

tm initTm() {
    time_t rawTime;
    ::time(&rawTime);
    return *::localtime(&rawTime);
}

tm Indice::dataTime = initTm();

为避免可能的链接问题,请将该函数设为静态或将其放在未命名的命名空间中。

答案 1 :(得分:4)

struct tm get_current_localtime() {
    time_t now = time(0);
    return *localtime(&now);
}

struct tm Indice::dataTime = get_current_localtime();

答案 2 :(得分:3)

将整个事物包装在函数中,并使用它来初始化静态成员:

tm gettime() {
    time_t rawTime;
    time ( &rawTime );
    return localtime(&rawTime);
}

tm Indice::dataTime = gettime();

您不需要(因此不应该)在C ++中使用struct为结构使用添加前缀:tm就足够了,不需要struct tm

答案 3 :(得分:2)

您不能在函数外任意调用函数。在main()函数中进行初始化,或者使用构造函数在tm结构周围创建一个包装器类。

答案 4 :(得分:1)

另请注意,struct tm是指向tm结构的指针。从localtime返回的是一个单例指针,当您或其他任何人再次调用localtime时,其内容将会更改。

答案 5 :(得分:0)

添加:

namespace {
  class Initializer {
    public:
      Initializer() { 
        time_t rawtime; time(&rawtime);
        YourClass::dataTime = localtime(&rawtime);
      }
  };
  static Initializer myinit();
}

在运行时初始化目标文件时,将调用构造函数Initializer(),然后根据需要设置“全局”变量dataTime。请注意,匿名命名空间构造有助于防止名称Initializer和myinit的潜在冲突。