Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

IvanR

Criando um novo tipo de dado em C++

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.