2012-04-07 3 views
2

У меня есть класс Логического И, конструктор должен оценить и работу двух булевых, и она работает так:ЬурейеГо, перечисление, BOOL, Bool ------ спутать

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

Существует ужасная путаница в основе второго фрагмента, который вы подавали чуть выше. – Robinson

+0

Есть немного путаницы в основе попыток определить класс для выполнения одной логической операции при построении. 'bool t1 = (m && n);' не кажется достаточно сложным, чтобы требовать больше кода, чтобы отвлечь его. О единственном моменте, который я вижу в нем, - это возможность подключать операции ... но даже тогда, поскольку операция выполняется при построении, код все еще должен принять решение о работе и иметь дело для каждой другой операции, которая может быть выполнена .... – cHao

ответ

3

Главный вопрос: почему вы хотели бы это сделать. Что вы хотите, чтобы макросы делали, так сказать, почему вы хотите, чтобы bools были перечислениями? Однако, чтобы увидеть, что происходит не так, вы должны смотреть на то, что ваши коды выглядят после того, как 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 
}; 

Так что причина, почему она ломается, является то, что вы пытаетесь сохранить в Ем возвращается с & & b в переменной типа Bool. Очевидным способом исправить это было бы делить макросы. Или вам нужно объяснить, зачем они вам нужны.

+0

Лично я предполагал, что кто-то экспериментировал/играл, чтобы посмотреть, что к чему :-). – Robinson

+0

Вот исходные комментарии к макросам: // Чтобы избежать двусмысленности между bool и char в g ++, используйте препроцессор // для переименования bool, true и false в наш собственный тип перечисления –

+0

С кодом он все еще делает не компилировать: «initializing»: невозможно преобразовать из «bool» в «Bool» ....... Но немного модифицированная версия (с литой) работает: logicAND (Bool a, Bool b): value ((Bool) (a && b)) {} –

1

После #define bool Bool, участник value становится типа enum Bool.
Вы пытаетесь инициализировать его & & b, который не относится к типу enum Bool, а относится к базовому типу bool.
Вот почему вы получаете ошибку компилятора.

Fix: Заменить конструктор:

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

Да, этот актер работает ... все еще не совсем понимает, что происходит .... это внутренний тип «bool», а также «false» и «true», переопределенный макросами? –

+0

№ Макросы обрабатываются препроцессором, который выполняется перед компилятором, и он заменяет строки только в исходном коде. – mihai

Смежные вопросы