2012-04-07 212 views
2

我有一個邏輯和類,構造函數應該評估2個布爾的AND運算,它的工作原理是這樣的:的typedef,枚舉,布爾,布爾------迷茫

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 2012-04-07 16:26:36

+0

在上面提供的第二個片段的核心處存在可怕的混淆。 – Robinson 2012-04-07 16:33:29

+0

試圖定義一個班級來完成施工中的一個邏輯操作的核心有點混亂。 'bool t1 =(m && n);'似乎不夠複雜,需要更多的代碼才能將它抽象出來。關於我看到的唯一的一點是插入操作的能力......但即使如此,該操作在施工中完成,代碼仍然需要決定操作,並且可以執行其他每個操作的情況.... – cHao 2012-04-07 16:37:18

回答

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

那麼,爲什麼它打破的原因,是你嘗試存儲的布爾從Bool類型的變量中從& &b返回。解決這個問題的顯而易見的方法是刪除宏。或者你需要解釋爲什麼你需要他們。

+0

就我個人而言,我認爲這是有人試驗/玩耍,看看是什麼:-)。 – Robinson 2012-04-07 16:53:38

+0

這裏是宏的原始註釋: //爲了避免g ++中bool和char之間的不確定性,使用預處理器 //將bool,true和false重命名爲我們自己的枚舉類型 – 2012-04-07 17:00:08

+0

使用代碼,它仍然會不能編譯:'初始化':不能從'bool'轉換爲'Bool'.......但是稍微修改過的版本(與一個強制轉換)起作用:logicAND(Bool a,Bool b):value((Bool) (a && b)){} – 2012-04-07 17:05:19

1

#define bool Bool之後,成員value成爲enum Bool類型。
您正試圖用一個& & b初始化它,它不是enum Bool類型,而是基本類型bool。
這就是爲什麼你得到一個編譯器錯誤。

修復:你爲什麼要做到這一點,在所有

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

是的,這個演員工作......仍然不太明白髮生了什麼....是內部的「布爾」類型,以及由宏覆蓋的「假」和「真」? – 2012-04-07 17:07:48

+0

編號宏由在編譯器之前執行的預處理器處理,它只替換源代碼中的字符串。 – mihai 2012-04-07 17:38:40