我想将tm结构用作类中的静态变量。花了一整天阅读和尝试,但它仍然无法工作:(如果有人可以指出我做错了,将不胜感激
在我的班级中,在Public下,我已将其声明为:
static struct tm *dataTime;
在main.cpp中,我试图用系统时间来定义和初始化它以进行测试(在运行时输入的实际时间)
time_t rawTime;
time ( &rawTime );
tm Indice::dataTime = localtime(&rawTime);
但似乎我不能在函数外使用time()。
main.cpp:28:错误:预期 构造函数,析构函数或类型 '''令牌
之前的转换
如何在类的静态tm中初始化值?
答案 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的潜在冲突。