我到处都看了,但还没有找到答案。
我有一个带有这些受保护成员的C ++类:
struct tm _creationDate;
struct tm _expirationDate;
struct tm _lockDate;
我想在实例化时初始化它们。如果我把它放在构造函数中:
_creationDate = {0};
_expirationDate = {0};
_lockDate = {0};
编译器抱怨:“在{'token”之前预期的primary-expression
我也找不到在构造函数顶部的成员初始化列表中执行此操作的方法。怎么做到这一点?谢谢!
后续: 伙计们,谢谢你的回复。你不能在宣言中这样做;这是不允许的。所以唯一的方法似乎是memset或单独设置成员。我最后编写了一个实用程序函数来做到这一点。
答案 0 :(得分: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;
答案 1 :(得分:1)
http://www.cprogramming.com/tutorial/initialization-lists-c++.html
class C {
struct tm _creationDate;
struct tm _expirationDate;
struct tm _lockDate;
C() : _creationDate(), ... {}
答案 2 :(得分: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));
答案 3 :(得分:0)
只有在C ++ 03中才有可能:
class foo
{
tm _creationDate;
public:
foo()
{
tm tmp_tm = {0};
_creationDate = tmp_tm;
}
};
请注意,这将使用_creationDate
的副本初始化tmp_tm
,从而调用(最可能是自动生成的)复制构造函数。因此,对于大型结构,您应该坚持使用实用程序功能,因为这不需要复制整个结构。
顺便说一句,不应该使用以下划线开头的名称,因为它们是为标准库的实现而保留的(供内部使用),因此这可能会导致名称冲突或其他不良行为。