C++ 带布尔字段的结构默认初始化?
我有以下用例,一个包含一些布尔和int变量的结构C++ 带布尔字段的结构默认初始化?,c++,C++,我有以下用例,一个包含一些布尔和int变量的结构 struct a { int field1; bool field2; bool field3; }; 我正在重构这段代码,并为结构编写构造函数,问题是字段的默认初始化 我不是在批评任何语言结构,但理想情况下,我希望null成为语言本身的一部分 我的意思是我应该能够将结构a定义为 a : field1(null.int), field2(null.bool), field3(null.bool) {} C++不允许
struct a {
int field1;
bool field2;
bool field3;
};
我正在重构这段代码,并为结构编写构造函数,问题是字段的默认初始化
我不是在批评任何语言结构,但理想情况下,我希望null成为语言本身的一部分
我的意思是我应该能够将结构a定义为
a : field1(null.int), field2(null.bool), field3(null.bool) {}
C++不允许,因为未定义null.int或null.bool。在C++中唯一的方法是< /P>
a: field1(-1), field2(false), field3(false) {}
你能行
struct a {
a():field1(), field2(), field3() { }
int field1;
bool field2;
bool field3;
};
所有字段将分别为零和false。如果你想说字段有一个不确定的值,恐怕你必须使用其他技术。一是使用:
结构a{
a():字段1(int()),字段2(bool()){}
可选字段1;
可选字段2;
可选字段3;
};
使字段3不确定。使用
*字段名称
访问值。使用field==boost::none
或if(field){…}
测试none值 布尔值有两种状态。这就是为什么它是布尔型的。因此,在任何强类型语言中,布尔值要么为真,要么为假
c/c++(和java)中的整数是数字的直接二进制表示形式。您可以将该数字的一个值指定为“该数字没有值”,但这并不是在所有情况下都有意义-如果语言考虑到这一点,则每个数学运算之前都必须进行一次检查-这将真正降低速度
底线:如果您想要弱类型系统,请使用另一种语言。您似乎希望能够说字段处于未定义状态 这违反了强类型语言(如C++)的原则,因此您运气不佳。
如果您想检查某个内容是否已定义为not,您需要自己显式跟踪它。你可以使用指针来解决你的问题,但我个人认为这不是一个好主意
如果您试图解释您试图解决的真正问题,我们可能会提供更好的建议。如果您正在寻找值为{true,false,null}的类型,则该类型不是bool。然而,
boost::optional
就是这样一种类型。同样,boost::optional
可以保存任何int,也可以根本不保存int
[编辑]
或代码< > STD::可选的< />代码,因为C++ 17。< /p> < p>这是C++方式,不为任何不使用的东西和缺省初始化而付出代价,而拥有未初始化的布尔的能力是许多人不需要的。 如果你真的想要这种行为,你可以为你正在使用的类型建立一个可为空的版本。 大致如下:
class NullBool {
bool m_null;
bool m_value;
public:
NullBool() : m_null(true) {}
NullBool(bool value) : m_null(false), m_value(value) {}
void isNull() const {
return m_null;
}
void value() const {
return m_value;
}
...
// lots of operations
...
};
这可能应该作为一个模板构建,这样它就可以适用于更多的开箱即用类型。由于它是您自己的类型,您可以轻松地使默认构造函数在默认情况下为null。该模板将是。。。boost::可选?看起来确实如此,直到litb编辑了他的帖子提到它,我才知道:)
class NullBool {
bool m_null;
bool m_value;
public:
NullBool() : m_null(true) {}
NullBool(bool value) : m_null(false), m_value(value) {}
void isNull() const {
return m_null;
}
void value() const {
return m_value;
}
...
// lots of operations
...
};