我有以下用例,一个带有一些boolean和int变量的结构
struct a {
int field1;
bool field2;
bool field3;
};
我正在重构这段代码,并为struct编写构造函数,问题是字段的默认初始化。
我不批评任何语言构造,但理想情况下我希望null成为语言本身的一部分
我的意思是我应该能够将struct a定义为
a : field1(null.int), field2(null.bool), field3(null.bool) {}
C ++不允许它,因为没有定义null.int或null.bool。在C ++中唯一的方法是
a: field1(-1), field2(false), field3(false) {}
答案 0 :(得分:9)
你可以做到
struct a {
a():field1(), field2(), field3() { }
int field1;
bool field2;
bool field3;
};
所有字段分别为零和假。如果你想说这些字段具有不确定的值,我担心你必须使用其他技术。一种是使用boost::optional
:
struct a {
a():field1(int()), field2(bool()) { }
optional<int> field1;
optional<bool> field2;
optional<bool> field3;
};
使field3不确定。使用*field_name
访问值。使用field == boost::none
或if(field) { ... }
测试无值。
答案 1 :(得分:4)
如果您正在寻找值为{true,false,null}的类型,那么该类型不是bool。但是,boost::optional<bool>
就是这种类型。同样,boost::optional<int>
可以包含任何int,或者根本不包含int。
答案 2 :(得分:3)
布尔值有两种状态。这就是使它成为布尔值的原因。因此,在任何强类型语言中,布尔值为true或false。
c / c ++(和java)中的整数是数字的直接二进制表示。您可以指定该数字的一个值来表示“此数字没有值”,但这在所有情况下都没有意义 - 如果语言考虑到这一点,则每个数学运算都必须先进行检查 - 这会让事情变慢。
底线:如果您想要弱类型系统,请使用其他语言。
答案 3 :(得分:2)
您似乎希望能够说明字段处于未定义状态。
这违反了强类型语言(例如C ++)的原则,所以你运气不好 如果您想检查是否已定义某些内容,则需要自行明确跟踪。您可能会使用指针来解决您的问题,但我个人认为这不是一个好主意。
也许如果你试图解释你想要解决的真正问题,我们可以提供更好的建议。
答案 4 :(得分:1)
这是c ++的方式,不支付你不使用的任何东西和默认初始化,并且具有未初始化的bool的能力是很多人不需要的。
如果您真的想要这种行为,可以构建您正在使用的类型的可空版本。 一些事情:
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。