IvanR 0 Denunciar post Postado Julho 24, 2008 Olá a todos, estou precisando criar um novo tipo de dado parecido com o Booleano, só que o mesmo teria 3 parâmetros: True, False, Null ou seja, ao declarar uma variável faria da seguinte forma: bool booleanoAntigo; nbool booleannoNovo; o booleanoAntigo seria o normal, com apenas true e false, mas o booleanoNovo teria 3 parâmetros, True, False e Null e ainda conseguiria fazer todas as comparações lógicas que um booleano faz. Alguém poderia me ajudar em como poderia fazer isto? Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Julho 24, 2008 Olha só cara tenho duas soluções... uma é usando classe, mais trabalhoso e não dá pra fazer de tudo (if(oi) ou nbool oi = False não rolam por exemplo), mas pega uns conteúdos interessantes: #include <iostream> #define True 1 #define False 0 #define Null -1 using namespace std; class nbool { public: nbool() { meuvalor = Null; } void operator=(int valor) { if(valor >= Null && valor <= True) { meuvalor = valor; } } bool operator==(nbool outro) { if(meuvalor == Null) { return false; } else { return meuvalor == outro.meuvalor; } } bool operator==(bool outro) { if(meuvalor == Null) { return false; } else { return meuvalor == outro; } } private: int meuvalor; }; int main() { nbool oi; nbool outro; oi = True; outro = False; cout << "oi: " << (oi == 10); cin.get(); return 0; } Ou pode só usar um typedef logo: #include <iostream> #define True 1 #define False 0 #define Null -1 using namespace std; typedef int nbool; int main() { nbool oi = False; nbool outro = True; cout << "oi: " << (oi == outro); cin.get(); return 0; } O problema, é que daí Null vai contar como True se você for comparar um que é = Null e outro é = True, vai dar True na resposta. Não tem como tratar daí. Veja as duas opções, e veja a que mais lhe agrada. Ou se alguém achar alguma opção melhor, vá em frente!!! Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 25, 2008 O problema, é que daí Null vai contar como True se você for comparar um que é = Null e outro é = True, vai dar True na resposta. Não tem como tratar daí. Claro que tem como tratar. Os bancos de dados usam NULL/UNKNOWN e funcionam... #include <iostream> #include <exception> using namespace std; class TruthException: public exception { virtual const char* what() const throw(){ return "Value not allowed:"; } }ValueException; class Truth { float myValue; public: #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef UNKNOWN #define UNKNOWN 0.5 #endif Truth():myValue(UNKNOWN){} Truth(const float value) { try { if(value == UNKNOWN || value == TRUE || value == FALSE) myValue = value; else throw ValueException; } catch(exception& e) { cout << e.what() << "(" << value << ")\n"; } } Truth operator = (const float value) { try { if(value == UNKNOWN || value == TRUE || value == FALSE) myValue = value; else throw ValueException; } catch(exception& e) { cout << e.what()<< "(" << value << ")\n"; } } bool operator == (const Truth &op2) const { if (myValue == UNKNOWN || op2.myValue == UNKNOWN) return false; else if (myValue == op2.myValue) return true; else return false; } float getValue() const { return myValue; } string toString() const { if (myValue == TRUE) return "TRUE"; else if (myValue == FALSE) return "FALSE"; return "NULL"; } }; int main(void) { Truth A; A = TRUE; cout << A.getValue() << "=" << A.toString() << endl; Truth B; B = UNKNOWN; Truth C(FALSE); cout << TRUE << "==" << FALSE << "?" << (A==C) << endl; cout << TRUE << "==" << UNKNOWN << "?" << (A==B) << endl; cout << UNKNOWN << "==" << UNKNOWN << "?" << (B==B) << endl; Truth D(0.8); } Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Julho 25, 2008 O problema, é que daí Null vai contar como True se você for comparar um que é = Null e outro é = True, vai dar True na resposta. Não tem como tratar daí. Claro que tem como tratar. Os bancos de dados usam NULL/UNKNOWN e funcionam... Oi Isis, ali eu tava falando do segundo código que eu postei que eu usei só um typedef xexelento pra fazer os bagulhos e achei que ia ficar meio difícil de fazer tudo funcionar ao mesmo tempo :P Até! Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 25, 2008 Ainda assim dá. O que você nao fez foi verificar se o negocio eh Null e retornar falso se for. Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Julho 26, 2008 Ainda assim dá. O que você nao fez foi verificar se o negocio eh Null e retornar falso se for. Só acho que daí fica meio xexelento ficar fazendo isso em todos os ifs :P Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 26, 2008 Não conhece função? De qualquer forma, o tad fica melhor numa classe justamente por causa da sobrecarga de operador. Ai você nao tem desculpa. :P Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Julho 28, 2008 Olá a todos, desculpe a demora por responder mas darei uma boa olhada nos códigos e já agradeço pela ajuda! vlw mesmo! Não sei mexer muito bem com sobrecarga de operadores e acho q com isso posso aprender bem este tema! Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Julho 29, 2008 Olhando o seu código fiz uma pequena modificação Nesta parte bool operator == (const Truth &op2) const { if (myValue == UNKNOWN || op2.myValue == UNKNOWN) return true; else if (myValue == op2.myValue) return true; else return false; } Troquei o || por && bool operator == (const Truth &op2) const { if (myValue == UNKNOWN && op2.myValue == UNKNOWN) return false; else if (myValue == op2.myValue) return true; else return false; } pois 0.5 == 0.5 estava dando false, ainda tenho de ver o resto da lógica do seu programa, mas de resto parece estar belezinha! EEDIT: 2 coisas que não entendi em seu código: Truth():myValue(UNKNOWN){} virtual const char* what() const throw(){ Sabe me dizer como trabalham amigo? Abração Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 29, 2008 Esta dando false porque é pra dar false. Veja a teoria de banco de dados. http://msdn.microsoft.com/en-us/library/aa664483(VS.71).aspx // Equality operator. Returns Null if either operand is Null, otherwise // returns True or False. public static DBBool operator ==(DBBool x, DBBool y) { if (x.value == 0 || y.value == 0) return Null; return x.value == y.value? True: False; } Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Julho 29, 2008 Ta certo, dessa eu não sabia, mas e sobre as partes de seu programa, só uma explanação rapida sobre oq significam? A primeira é um construtor, mas não estou vendo o motivo de já jogar um UNKNOWN para o mesmo E o segundo, de onde vem esse what() ? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 29, 2008 Se você nao definiu nenhum valor no construtor, vai ser o que? UNKNOWN... Só olhar a definição da exceção la em cima que você sabe de onde vem o what. Compartilhar este post Link para o post Compartilhar em outros sites