2

我有一个 logicAND 类,构造函数应该评估两个布尔值的 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();
}

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

感谢指出陷阱,原因和解决方案。谢谢!

4

2 回答 2

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

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

于 2012-04-07T16:41:38.513 回答
1

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

修复:将构造函数替换为:

logicAND(bool a,bool b):value((Bool)(a&&b)){};
于 2012-04-07T16:41:54.233 回答