4

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

在我的课堂上,在 Public 下,我已将其声明为:

static struct tm *dataTime;

在 main.cpp 中,我尝试使用系统时间来定义和初始化它,以便临时测试出来(实际时间在运行时输入)

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

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

main.cpp:28: 错误: '(' 标记之前的预期构造函数、析构函数或类型转换

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

4

6 回答 6

7

您可以将上述内容包装在一个函数中:

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

tm Indice::dataTime = initTm();

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

于 2010-01-20T21:29:23.253 回答
4
struct tm get_current_localtime() {
    time_t now = time(0);
    return *localtime(&now);
}

struct tm Indice::dataTime = get_current_localtime();
于 2010-01-20T21:29:49.530 回答
3

将整个东西包装在一个函数中,并使用它来初始化您的静态成员:

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

tm Indice::dataTime = gettime();

而且您不需要(因此不应该)struct在 C++ 中使用 struct 前缀:tm就足够了,struct tm不需要。

于 2010-01-20T21:30:48.133 回答
2

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

于 2010-01-20T21:28:43.743 回答
1

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

于 2010-01-20T21:31:06.963 回答
0

添加这个:

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

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

于 2010-01-20T21:33:54.887 回答