2012-04-07 94 views
2

我有一个逻辑和类,构造函数应该评估2个布尔的AND运算,它的工作原理是这样的:的typedef,枚举,布尔,布尔------迷茫

class logicAND{ 
public: 
    logicAND(bool a,bool b):value(a&&b){} 
    bool output(){return value;} 
private: 
    bool value; 
}; 
int main(){ 
    bool m=false; 
    bool n=true; 
    logicAND t1(m,n); 
    t1.output(); 
} 

然后,我在课前添加了一些旧式的宏:

typedef enum { False = 0, True = 1 } Bool; 
#define bool Bool 
#define true True 
#define false False 

class logicAND{ 
public: 
    logicAND(bool a,bool b):value(a&&b){} 
    bool output(){return value;} 
private: 
    bool value; 
}; 
int main(){ 
    bool m=false; 
    bool n=true; 
    logicAND t1(m,n); 
    t1.output(); 
} 

现在我不能再让它工作了。看起来主要问题在于构造函数类型不匹配。

非常感谢您指出缺陷,原因和解决方案。 谢谢!

+3

...我应该问: 替换的构造?什么是真正的目标? – cHao 2012-04-07 16:26:36

+0

在上面提供的第二个片段的核心处存在可怕的混淆。 – Robinson 2012-04-07 16:33:29

+0

试图定义一个班级来完成施工中的一个逻辑操作的核心有点混乱。 'bool t1 =(m && n);'似乎不够复杂,需要更多的代码才能将它抽象出来。关于我看到的唯一的一点是插入操作的能力......但即使如此,该操作在施工中完成,代码仍然需要决定操作,并且可以执行其他每个操作的情况.... – cHao 2012-04-07 16:37:18

回答

3

主要问题是你为什么要这样做。你想让这些宏做什么,可以这么说,你为什么要让这些布尔变成枚举? 但是看到了什么错误,你要看看你的代码是什么样子后preprossesor取代你的宏:

class logicAND 
{ 
public: 
    logicAND(Bool a,Bool b):value(a&&b){} //Expects two Bools which works. Now it trys to do a&&b, this actually is well defined for enums. However it returns a bool (!) which cannot be stored in "value" since that is a Bool. 
    Bool output(){return value;} 
private: 
    Bool value; //This now is a Bool! Not a real bool 
}; 

那么,为什么它打破的原因,是你尝试存储的布尔从Bool类型的变量中从& &b返回。解决这个问题的显而易见的方法是删除宏。或者你需要解释为什么你需要他们。

+0

就我个人而言,我认为这是有人试验/玩耍,看看是什么:-)。 – Robinson 2012-04-07 16:53:38

+0

这里是宏的原始注释: //为了避免g ++中bool和char之间的不确定性,使用预处理器 //将bool,true和false重命名为我们自己的枚举类型 – 2012-04-07 17:00:08

+0

使用代码,它仍然会不能编译:'初始化':不能从'bool'转换为'Bool'.......但是稍微修改过的版本(与一个强制转换)起作用:logicAND(Bool a,Bool b):value((Bool) (a && b)){} – 2012-04-07 17:05:19

1

#define bool Bool之后,成员value成为enum Bool类型。
您正试图用一个& & b初始化它,它不是enum Bool类型,而是基本类型bool。
这就是为什么你得到一个编译器错误。

修复:你为什么要做到这一点,在所有

logicAND(bool a,bool b):value((Bool)(a&&b)){}; 
+0

是的,这个演员工作......仍然不太明白发生了什么....是内部的“布尔”类型,以及由宏覆盖的“假”和“真”? – 2012-04-07 17:07:48

+0

编号宏由在编译器之前执行的预处理器处理,它只替换源代码中的字符串。 – mihai 2012-04-07 17:38:40