【问题标题】:typedef, enum, bool, Bool ------confusedtypedef, enum, bool, Bool ------困惑
【发布时间】:2012-04-07 16:24:03
【问题描述】:

我有一个 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();
}

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

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

【问题讨论】:

  • ...我应该问你为什么要这样做吗?真正的目标是什么?
  • 您刚刚在上面提供的第二个片段的核心有一个可怕的混乱。
  • 在尝试定义一个类来对构造执行一个逻辑操作时,存在一些困惑。 bool t1 = (m && n); 似乎不够复杂,不需要更多代码来抽象它。关于我在其中看到的唯一一点是插入操作的能力......但即便如此,由于操作是在构造时完成的,代码仍然必须决定操作并为彼此的操作提供一个案例,可以被执行....
  • "然后,我添加了一些老式宏".....为什么?
  • 是的,你应该写#define bool long,然后它就会被编译。这个评论和你的例子一样有意义!

标签: c++ class constructor boolean typedef


【解决方案1】:

主要问题是您为什么要这样做。你想让宏做什么,也就是说,为什么你想让布尔值成为枚举? 但是,要查看出现了什么问题,您必须查看预处理器替换宏后代码的样子:

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 类型的变量中。解决此问题的明显方法是删除宏。或者你需要解释你为什么需要它们。

【讨论】:

  • 就我个人而言,我认为这是有人在试验/玩弄看看是什么:-)。
  • 这里是带有宏的原始 cmets: // 为了避免 g++ 中 bool 和 char 之间的歧义,使用预处理器 // 将 bool、true 和 false 重命名为我们自己的枚举类型
  • 使用代码,它仍然无法编译:'initializing' : cannot convert from 'bool' to 'Bool'.......但是稍微修改的版本(带有演员表)可以工作: logicAND(Bool a,Bool b):value((Bool)(a&&b)){}
  • 代码只是在预处理器完成后从您的代码中产生的内容。添加演员表可以解决问题,这是真的。或者,您可以为枚举类型重载 && 运算符。但是,我怀疑它会比使用内置 bool 类型减少混乱。如果你真的想创建自己的 bool 类型,我建议创建一个类而不是枚举类型,并使用运算符重载。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,这个演员表工作......仍然不太明白发生了什么......是内部的“bool”类型,以及被宏覆盖的“false”和“true” ?
  • 没有。宏由在编译器之前执行的预处理器处理,它只替换源代码中的字符串。
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多