2010-01-20 39 views
3

我想在类中使用tm结构作为静态变量。花了一整天的时间阅读和努力,但仍然无法工作:(希望如果有人能指出我在做什么错初始化类中的静态结构tm

在我的课,公共下,我已宣布它为:

static struct tm *dataTime; 

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

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

但好像我不能用时间()外部功能

main.cpp:28: error: expected constructor, destructor, or type conversion before ‘(’ token

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

+0

dataTime是'tm *'还是'tm'? – 2010-01-20 21:34:12

+0

最好不要'tm *',因为'localtime'返回一个静态实例。 – 2010-01-20 21:35:14

回答

7

你可以用上面的功能:

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

tm Indice::dataTime = initTm(); 

为了避免可能出现的问题的连接,使功能静态或把它放在一个无名的命名空间。

+2

+1对于未命名的名称空间。 (咳嗽,不是匿名,咳嗽) – GManNickG 2010-01-20 21:49:07

+1

谢谢,改变了。也许我会记住大部分C++术语...... – 2010-01-20 21:52:38

+0

嘿,这里太多了。我只是愚蠢的,匿名的和未命名的意思是相同的,但不符合标准。 :|愚蠢的委员会。 – GManNickG 2010-01-20 21:54:09

2

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

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

struct tm Indice::dataTime = get_current_localtime(); 
2

裹在函数整个事情,并用它来初始化静态成员:

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

tm Indice::dataTime = gettime(); 

而你并不需要(因此不应该)的前缀结构使用与struct在C++中:tm就够了,没有struct tm需要。

1

另请注意,您的struct tm是指向tm结构体的指针。本地时间返回是一个单身指针,当你或其他人再次调用localtime时,其内容将会改变。

+0

'localtime'返回一个静态实例。所以,它不是线程安全的或可重入的。还有'localtime_r'更健壮。 – 2010-01-20 21:33:47

+0

我的回答稍微补偿了它的内容,但是仍然无法通过任何方式使其线程安全。 – 2010-01-20 21:34:24

+0

没意识到。更新,谢谢。这是多么愚蠢的模式。 – 2010-01-20 22:13:30

0

补充一点:

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

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

+0

这种方法与使用上述函数的直接初始化相比有什么优势吗? – 2010-01-20 23:13:06