我正在用C ++重新设计一个类构造函数,需要它来捕获一个未指定的bool。我已经为所有其他参数使用了默认值,但是根据我的理解,bool只能初始化为true或false。由于这两种情况都在类中有意义,我应该如何处理从默认值检查更改?
答案 0 :(得分:40)
现实是你不能这样做。 bool有值,无论是true还是false,如果你没有初始化它,那么它是随机的true或false,可能在每次运行程序或分配该类时都不同。
如果您需要具有更多选项的类型,请定义枚举。
typedef enum MyBool {
TRUE,
FALSE,
FILENOTFOUND
} MyBool;
答案 1 :(得分:36)
三态布尔是走向黑暗面的道路。三态布尔导致愤怒。愤怒导致仇恨。仇恨导致痛苦。
不要使用三态布尔。
相反,使用一个额外的布尔值来判断第一个布尔值是否“初始化”(或更好,“已知”)。
class Prisoner : public Person
{
...
bool is_veredict_known;
bool is_guilty;
}
如果尚不知道预测,你无法判断囚犯是否真的有罪,但你的代码可以区分不同的情况。当然,宪法保证is_guilty的默认值应为false,但仍然......:)
顺便说一下,类不变量应该包括:
assert(is_veredict_known || !is_guilty);
答案 2 :(得分:18)
答案 3 :(得分:5)
如果这是您需要的,请创建一个值,该值表示可能尚未初始化的值的概念。
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;
}
答案 4 :(得分:4)
在C ++中,bool
只是一位信息,无论是0还是1.由于您想要表示三种可能的状态,您需要多一点信息。有两种通用技术:
bool
值来指示值是否为“default”或我可能会选择选项1。
答案 5 :(得分:3)
使用强大的boost :: optional。而且不仅适用于bools,也适用于您使用的所有其他地方 一些脏的未初始化值。它的用法如下:
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;
}
}
答案 6 :(得分:3)
struct Bool { //guaranteed initialized bool
bool v;
Bool() : v(false) {}
operator bool() const { return v; }
bool& operator=(const bool val){ return v = val; }
};
答案 7 :(得分:2)
您可以拥有一个单独的私有成员,指示bool值是否实际已初始化。
答案 8 :(得分:1)
我不太明白,但我会尝试......
如果您具有未指定某些值的聚合初始值设定项,则会应用默认值。在这种情况下,bool的默认值为false。在类中,“默认”值将是未初始化的,这意味着它可以是任何值,并且可以在运行之间更改。
如果您对bool是否发生变化感兴趣,最好的选择是用第二个bool默认为false来跟踪它,或使用代表3种可能状态的枚举。如果你真的想要3个州,你真的不想要一个布尔。
答案 9 :(得分:1)
你真的不能。你能提供第二个构造函数,例如:
class MyClass {
public:
MyClass(bool bFlag); // <-- not default
MyClass(void); // <-- default
};
答案 10 :(得分:0)
使用枚举而不是布尔值。例如,要控制魔法等级:
enum {
MY_ENUM_NO_MAGIC,
MY_ENUM_SOME_MAGIC,
MY_ENUM_MORE_MAGIC
} MagicLevel;
然后让构造函数接受参数MagicLevel magic = MY_ENUM_NO_MAGIC
。
答案 11 :(得分:0)
class aclass
{
<stuff> lots of other things
bool mybool
bool ismyboolinit
void setmybool(bool b)
{
mybool = b;
ismyboolinit = true;
}
}
答案 12 :(得分:0)
如果您使用函数和类,只需重载它们。
即:
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.
}
//你走了此外,您不需要拥有可以使用重载函数的类。