2015-11-13 85 views
9

我有一个问题,那就是种类的跟进此:如何在添加成员时保持struct的初始化?

Initializing default values in a struct

我有一个已经拿到17级的bool一个结构和clear()方法他们都设置为false。这是一个长期的项目;该代码仍然可以使用多年,并且可以添加到。有没有办法初始化所有会自动扩展的成员,这样有人添加新成员到结构不需要记住将它们添加到clear()方法(除了注释“请不要忘记”)?

此代码库目前不是C++ 11,所以我不认为我可以在声明中进行初始化。

的代码是这样的:

typedef struct { 
    bool doThingA; 
    bool doThingB; 
    bool doThingC; 
    bool doThingD; 
    // etc for several more bools 

    void clear() { 
     doThingA = false; 
     doThingB = false; 
     doThingC = false; 
     doThingD = false; 
     // etc... 
    } 
} EnableFlags; 
+12

请找到教你说'typedef struct'的人,删除他们的电话号码,在Facebook上解除他们,并将他们移动至少两个城市。 –

+4

为什么不用'array' /'vector'或'bitset'? – Jarod42

+2

你可以使用'std :: array'来代替它,因为它是一个固定的大小,你可以在'clear'中自动知道大小。 –

回答

9
struct EnableFlags { 
    bool doThingA; 
    bool doThingB; 
    bool doThingC; 
    bool doThingD; 
    // etc for several more bools 

    void clear() { 
     *this = EnableFlags(); 
    } 
}; 

这将创建一个临时的所有成员设置为零,然后进行*this它的一个副本。所以它将所有成员设置为零,无论有多少。

这假设你没有定义一个默认的构造函数来执行其他操作,而不是将所有的标志设置为false。如果你没有用户定义的构造函数,那么这个假设就成立了。

由于C++ 11它的更简单:

void clear() { 
    *this = {}; 
} 
+2

'* this = {};'是危险的,好像该类有一个赋值运算符采用'int',那么它比复制赋值运算符更受欢迎。 [看这里的完整例子](http://stackoverflow.com/questions/33511641/overload-resolution-assignment-of-empty-braces) –

+1

也,'* this = EnableFlags();'在C中默认初始化++ 98,但在C++ 03中进行数值初始化。如果OP使用C++ 98(例如32位Borland/Embarcadero编译器),我会提到这一点 –

+1

任何使用C++ 98而不是C++ 03的人都值得他们得到任何东西。现在是2015年,如果你的编译器已经足够大到可以合法喝酒了,那么你有一个问题应该通过改变编译器来解决,而不是通过损害你的代码。 –

2

一种选择是使用静态断言关于结构的clear函数内的大小。

首先确定结构的当前大小。比方说,这是68然后,补充一点:

void clear() 
{ 
    BOOST_STATIC_ASSERT(sizeof(EnableFlags) == 68 && "You seem to have added a data member. Clear it before changing the number 68 to match current struct size!!"); 

    // the rest as before ... 
} 

我使用Boost的静态断言宏,但你可以使用任何你想要的其他一个或推出自己的。

有了这样的断言,当结构的大小发生变化时,代码将无法编译。这不是一个全面的解决方案,但确实提供了保障。

+0

布尔AND与字符串文字有什么关系? –

+0

@ M.M将消息走私到要声明的表达式中。它可以成为编译器错误信息的一部分。 – Angew

1

只需使用objetcs。

所以你可以使用'for'循环检查一个std :: vector,如果它们的值为false或true。

所以你没有你的未来合作者每次创建一个新的布尔变量时都会输入“false”值。

这里没有结构。

+0

这似乎没有道理。结构实例是对象 –

+0

我的意思是班级和所有POO的东西。 – Madz