typedef,enum,bool,Bool ------迷茫

时间:2012-04-07 16:24:03

标签: c++ class constructor boolean typedef

我有一个逻辑组类,构造函数应该评估两个布尔值的AND运算,它的工作原理如下:

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();
}

现在我不能再继续工作了。似乎主要问题在于构造函数类型不匹配。

对于指出陷阱,原因和解决方案表示赞赏。 谢谢!

2 个答案:

答案 0 :(得分:3)

主要问题是你为什么要这样做。您希望宏做什么,所以说,为什么要将bools作为枚举? 但是,要查看出现问题的原因,您必须在预处理器替换宏后查看代码的外观:

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
};

所以它破坏的原因是你试图将一个&& b返回的bool存储在Bool类型的变量中。解决这个问题的明显方法是删除宏。或者您需要解释为什么需要它们。

答案 1 :(得分:1)

#define bool Bool之后,成员value变为enum Bool类型 您正尝试使用&&amp ;;初始化它b,不是enum Bool类型,而是基本类型bool 这就是你得到编译器错误的原因。

修正: 用以下内容替换构造函数:

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