繁体   English   中英

C ++中bool的默认值

[英]Default value for bool in C++

我正在重新设计C ++中的类构造函数,需要它来捕获未指定的布尔值。 我为所有其他参数使用了默认值,但是据我了解,布尔只能被初始化为true或false。 既然这两种情况在类中都有意义,那么我应该如何处理从默认值开始的更改检查?

现实是您无法做到这一点。 布尔值是true或false,如果尚未初始化,则它是随机的true或false,在每次运行该程序或分配该类时可能会有所不同。

如果需要具有更多选项的类型,请定义一个枚举。

typedef enum MyBool {
    TRUE,
    FALSE,
    FILENOTFOUND
} MyBool;

三态布尔是通往黑暗面的道路。 三态化合物引发愤怒。 愤怒导致仇恨。 仇恨导致痛苦。


最好不要使用三态布尔。

而是使用一个附加的布尔值来确定第一个布尔值是否已“初始化”(或更好的是“已知”)。

class Prisoner : public Person
{


  ...

  bool is_veredict_known;
  bool is_guilty;
}

如果判决尚不明确,您将无法确定囚犯是否真的有罪,但是您的代码可以区分不同情况。 当然,宪法保证is_guilty的默认值应该为false,但是... :)

顺便说一句,类不变式应包括:

assert(is_veredict_known || !is_guilty);

听起来您想要boost :: tribool或也许boost :: optional <bool>

如果这是您需要的,请创建一个值,该值表示未初始化的值的概念。

template <typename T>
struct Maybe {
  Maybe() : m_hasValue(false) {}
  bool HasValue() const { return m_hasValue; }
  T& Value() { ThrowIfFalse(m_hasValue); return m_value; }
  const T& Value() const { ThrowIfFalse(m_hasValue); return m_value; }
  void SetValue( _In_ const T& value) { m_value = value; m_hasValue = true; }
private:
  bool m_hasValue;
  T m_value;
};

现在,您可以代表所需的所有3个状态。

class SomeType { 
  ...
  Maybe<bool> m_myBool;
}

在C ++中, bool只是信息的一部分,即0或1。由于要表示三种可能的状态,因此需要更多信息。 有两种通用技术:

  1. 使用另一个bool值来指示该值是否为“默认”,或者
  2. 使用带有三个值的枚举类型来表示(默认,true,false)。

我可能会选择选项1。

使用强大的boost :: optional。 不仅对于布尔值,对于所有其他地方,您都在其中使用了一些脏的未初始化的值。它的用法如下:

void function(optional<int> value) {
   if (value)
      std::cout << "value is defined: " << value.get() << "\n";
   else
      std::cout << "value is not defined\n";
}

这是一个返回可选参数的函数示例:

struct MapClass {
   map<string,int> m_map;

   optional<int> getValue(string key) {
      optional<int> result = none;
      if (m_map.find(key) != m_map.end())
         result = m_map[key];
      return result;
   }
}
struct Bool { //guaranteed initialized bool
    bool v;

    Bool() : v(false) {}
    operator bool() const { return v; }
    bool& operator=(const bool val){ return v = val; }
};

您可以有一个单独的私有成员,该成员指示bool值是否已实际初始化。

我不太了解,但我会尝试...

当您具有未指定某些值的聚合初始化程序时,将应用默认值。 在这种情况下,bool的默认值为false。 在一个类中,“默认”值将是未初始化的,这意味着它可以是任何值,并且可以随运行而变化。

如果您对布尔值是否已更改感兴趣,最好的选择是使用默认为false的第二个布尔值来跟踪它,或者使用表示3种可能状态的枚举。 如果您确实想要3个状态,那么您真的不想要布尔。

你真的不行 您能否提供第二个构造函数,例如:

class MyClass {
  public:
    MyClass(bool bFlag); // <-- not default
    MyClass(void);       // <-- default
};
class aclass
{
    <stuff> lots of other things
    bool mybool
    bool ismyboolinit

    void setmybool(bool b)
    {
        mybool = b;
        ismyboolinit = true;
    }

}

好吧,如果您使用函数和类,只需重载它们即可。

即:

    class thing
{
  public:
   void f1(bool); // bool input
   void f1(int = 3); // default with out bool being known
  private:
   // stuff
};     
void thing::f1 (bool hasAFace)
{
  if(hasAFace)
   f1(0);
  if(!hasAFace)
   f1(1);

}

void thing::f1 (int tri)
{
  bool actionTime;
  if(tri == 1)
    actionTime = true;
   else if(tri == 0)
    actionTime = false;
   else
    //input defualt action here.
} 

//然后就到了。 同样,您不需要类,也可以使用重载函数。

而不是布尔值,请使用枚举。 例如,控制魔术等级:

enum {
    MY_ENUM_NO_MAGIC,
    MY_ENUM_SOME_MAGIC,
    MY_ENUM_MORE_MAGIC
} MagicLevel;

然后让您的构造函数接受参数MagicLevel magic = MY_ENUM_NO_MAGIC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM