2010-10-31 67 views
2

我看遍了所有的地方,但还没有找到答案。Basic C++:我如何初始化一个类的struct成员?

我与这些受保护的成员的C++类:

struct tm _creationDate; 
struct tm _expirationDate; 
struct tm _lockDate; 

我想在实例化时初始化它们。如果我把这个在构造函数中:

_creationDate = {0}; 
_expirationDate = {0}; 
_lockDate = {0}; 

编译器会抱怨:“预期主表达式前‘{’令牌”

我还不能找到一个方法来做到这一点的一个成员初始化列表在构造函数的顶部。如何做到这一点?谢谢!

后续: 感谢您的回复,伙计们。你不能在声明中这样做;这是不允许的。因此,唯一的方法似乎是memset或单独设置成员。我最终写了一个实用函数来做到这一点。

回答

2

您可以做他们在声明中这样

_creationDate = {0}; // set everything to 0's 

或类似这样的

_creationDate = { StructElement1, StructElement2, ..., StructElement n); 

_creationDate = { 0, false, 44.2); 

或者在构造函数只是调用每个元素在结构和初始化,如...

_creationData.thing1 = 0; 
_creationData.thing2 = false; 
_creationData.thing3 = 66.3; 
+2

谢谢。只有最后一个选项适用于C++对象;成员不允许带大括号的初始化器。 – Oscar 2010-11-01 00:20:35

1

我认为当你定义它,你只能初始化结构类似:

struct tm a = {0}; // works ok 
struct tm b; 
b = {0};   // error 

一种选择是要么使用“默认”值

class a 
{ 
    a() : t() {} 
    struct tm t; 
}; 
在构造

或者memset

struct tm creationDate; 
memset((void*)&creationDate, 0, sizeof(struct tm)); 
0

只有在C++ 03可能的方式:

class foo 
{ 
    tm _creationDate; 
    public: 
    foo() 
    { 
     tm tmp_tm = {0}; 
     _creationDate = tmp_tm; 
    } 
}; 

注意,这将初始化_creationDatetmp_tm副本,从而调用(最有可能自动生成)拷贝构造函数。因此,对于大型结构,您应该坚持使用实用函数,因为这不需要复制整个结构。

顺便说一句,不应该使用以下划线开头的名称,因为它们被保留用于实现标准库(用于内部使用),所以这可能会导致名称冲突或其他不良行为。