结构与布尔字段默认初始化?

时间:2009-01-05 09:07:06

标签: c++

我有以下用例,一个带有一些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) {}

5 个答案:

答案 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::noneif(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。