2012-04-07 4 views
2

を混同し、コンストラクタは2つのブールのAND演算を評価することになっている、そしてそれはこのように動作します:のtypedef、列挙型は、ブール値、ブール値は------私はlogicANDクラスを持っている

その後
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

+0

ちょうど上に書いた2番目の断片の心臓部にはひどい混乱があります。 – Robinson

+0

建設の論理的な操作を1つ行うクラスを定義しようとすると、混乱が生じることがあります。 'bool t1 =(m && n);')は、それを抽象化するためにもっと複雑なコードを必要とするほど複雑ではないようです。その中で私が見るのは、操作を取り込む能力だけですが、コンストラクション時に行われた操作は、コードはまだ操作を決定し、実行できる他の操作の場合があります。 – cHao

答えて

3

主な質問は、これを行う理由です。あなたはマクロに何をしたいのですか?言い換えれば、なぜあなたはboolを列挙型にしたいのですか?

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

だから、それが壊れる理由は、あなたがブール値を格納しようということである: は、しかし間違って何が起こっているかを確認するために、あなたのコードがpreprossesorがあなたのマクロを交換した後にどのように見えるかを見ていますBool型の変数で& & bから戻されます。これを修正する明白な方法は、マクロをデリートすることです。あるいは、なぜあなたがそれらを必要としているのか説明する必要があります。

+0

個人的に私は何かを見て周りを試したり遊んだりする人だと思った。 – Robinson

+0

ここに、マクロの元のコメントがあります: // g ++のboolとcharのあいまいさを避けるには、プリプロセッサ //を使用して、bool、true、およびfalseを独自の列挙型に変更します –

+0

コードでは、 '初期化': 'bool'から 'Bool'に変換することはできません...しかし、わずかに変更されたバージョン(キャスト付き)が動作します:logicand(Bool a、Bool b):value(Bool) (a && b)){} –

1

#define bool Boolの後に、メンバーvalueは型enum Boolになります。
& & bで初期化しようとしていますが、enum Bool型ではなく、基本型boolです。
そのため、コンパイルエラーが発生します。

修正: でコンストラクタを置き換え:あなたがすべてでこれをしたい理由

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

はい、このキャストは動作します...まだ何が起こっているのか分かりません....内部の "bool"型だけでなく、 "false"と "true"がマクロによってオーバーライドされていますか? –

+0

いいえ。マクロは、コンパイラの前に実行されるプリプロセッサによって処理され、ソースコード内の文字列のみを置き換えます。 – mihai