2

私は logicAND クラスを持っています。コンストラクターは 2 つのブール値の 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

主な質問は、なぜこれをやりたいのかということです。マクロに何をさせたいのですか?つまり、ブール値を列挙型にしたいのはなぜですか?ただし、何が問題なのかを確認するには、プリプロセッサがマクロを置き換えた後にコードがどのように見えるかを確認する必要があります。

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 型になります。
&& b で初期化しようとしていますが、これは enum Bool 型ではなく、基本型 bool です。
そのため、コンパイラ エラーが発生します。

修正: コンストラクターを次のものに置き換えます。

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