在我的小型GUI库中,不同的东西会导致Widget
变得不可见。
这是我目前的解决方案:
class Widget {
// ...
bool collapsed;
bool hidden;
bool excluded;
public:
bool isVisible() { return !collapsed && !hidden && !excluded; }
void hide() { hidden = true; }
void show() { hidden = false; }
// ...
};
我不喜欢三个布尔值用于表示相同的事实。
我考虑过使用int
:
class Widget {
int hiddenLevel{0};
bool isVisible() { return hiddenLevel == 0; }
void hide() { ++hiddenLevel; }
void show() { --hiddenLevel; }
};
但是,用户可能会不小心拨打hide()
两次。
是否有一种优雅的方法可以避免重复基本上做同样事情的变量?我不在乎小部件是collapsed
,hidden
还是excluded
,我只是想知道它是否可见,并且还原了折叠它,隐藏它的效果,或者排除它。
答案 0 :(得分:3)
我不喜欢三个布尔值用于表示相同的事实。
正如你自己所说,这不是“同一件事”。这三个条件都是独立的。
在我看来,你采取了正确的方法,isVisible()
看起来应该如此。
答案 1 :(得分:2)
使用枚举来表示窗口的状态:
enum window_state
{
OPENED,
CLOSED,
COLAPSED,
MINIMIZED,
...
};
请注意,这正是您使用“int solution”所做的事情,而这正是enums所取代的内容。
所以你的实现可能是这样的:
class Widget {
// ...
window_state current_state;
public:
bool isVisible() const
{
return current_state != window_state::CLOSED &&
current_state != window_state::MINIMIZED;
}
void hide() { current_state = window_state::CLOSED; }
void show() { current_state = window_state::OPPENED; }
// etc, etc...
};
答案 2 :(得分:0)
不要浪费这些东西!你只需要三个,所以让那个int的32个(概率)32个。然后,在C ++ 14中它就像tada一样简单,tada:
char hiddenLevelStoredAsACharacter;
hiddenLevelStoredAsACharacter |= 0b00000001;
或排除,如何:
hiddenLevelStoredAsACharacter |= 0b00000010;
如果这不起作用,可能有办法使用模板。