BoolTool






4.33/5 (5投票s)
2002 年 2 月 25 日
2分钟阅读

42331

297
一种使用枚举来操作多状态变量当前状态的快速方法。
引言
在很多情况下,我们需要跟踪多个控制变量(通常是布尔类型),并根据哪个控制变量被启用或为真来执行不同的操作。 例如,我需要在为自己开发的 VCADD (Vinay - CADD) 程序中做同样的事情,其中放置点、创建 2D 图形、创建 3D 图形、在不同方向旋转等都依赖于不同的控制变量以及鼠标点击。 所以我想出了这个方法。
考虑一种情况,一个对象向左、向右、向上或向下移动到另一个对象。
这里没有操作布尔类型变量,而是使用了一个未命名的枚举和 2 个数组。
enum {NONE = 0,LEFT,RIGHT,TOP,BOTTOM}; int Ref[] = {NONE,LEFT,RIGHT,TOP,BOTTOM}; char *Names[] = {"NONE","LEFT","RIGHT","TOP","BOTTOM"};
注意 - 除非另有说明,否则数组指的是 Ref
。
数组 Names
是可选的,仅用于警告消息。
只需要 4 个函数来启用或禁用特定的变量。
void GetIndex(int n)
这个函数非常重要。 它只是遍历数组,如果成功则返回所提供参数的索引,否则返回 -1。
void SetTrue(int n)
此函数将提供的参数设置为 true。
void SetFalse(int n)
此函数将提供的参数设置为 false。
bool IsTrue(int n)
如果提供的参数为 true,则返回 true,否则返回 false。
逻辑(或者可能是约定)是 -
数组中索引 0 处的元素为 true 或启用,其余为 false 或禁用。
最初,NONE
为 true,因为它是第一个元素。
函数 SetTrue(int)
最初只是将提供的参数与 NONE
交换,或者通常与第一个位置的任何内容交换。 因此,根据约定,它被设置为 true,其他被设置为 false。
函数 SetFalse(int)
将 NONE
与提供的参数交换,从而将 NONE
放在第一位并使其为 true。 在调用 SetFalse(int)
时,数组的元素可能已经被洗牌; 因此调用 GetIndex(int)
来了解 NONE
的位置。
SetFalse(int)
还会检查要禁用的参数是否在调用它之前被启用。 这非常重要,因为
- 最初,数组将如下所示
NONE LEFT RIGHT TOP BOTTOM
-
SetTrue(TOP)
使它成为TOP LEFT RIGHT NONE BOTTOM
-
SetFalse(TOP)
使它成为NONE LEFT RIGHT TOP BOTTOM
并且
IsTrue(TOP)
正确地返回 false。
如果没有检查,相反,如果第二步是这样的
SetFalse(TOP)
使它成为TOP LEFT RIGHT NONE BOTTOM
并且
IsTrue(TOP)
将返回 true! 为了避免这种情况,SetFalse(int)
执行检查。因此,通过检查,它会给出警告消息,这是 Names 数组存在的唯一原因。
如果提供的参数位于第一个位置,则函数 IsTrue(int)
返回 true,否则返回 false。
就是这样。 不需要 bool
变量。
我认为命名空间最适合这种情况。 我还需要知道是否有任何更简单的技术。 期待反馈。
[Ma-thth-e Sig-thee-ni]