Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带布尔字段的结构默认初始化?_C++ - Fatal编程技术网

C++ 带布尔字段的结构默认初始化?

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++不允许

我有以下用例,一个包含一些布尔和int变量的结构

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
  ...
};