simulação de inteiros de 40 dígitos

to estudando java acompanhando um livro aqui e tem uns exercícios pra fazer, um deles é este:
:arrow: criar uma classe que simule os inteiros para utilizar inteiros de até 40 dígitos, representando cada inteiro numa array onde cada elemento é um dígito. A classe deve conter as operações soma, subtração… e blablablá, basicamente as operações dos ints.

A classe eu to fazendo sem problemas, só que surgiu uma coisa que eu não entendi… por exemplo quando eu vou testar o seguinte código:

InteiroGigante ig = new InteiroGigante(+3); System.out.println(InteiroGigante.subtrair(ig, ig));
o método subtrair faz o seguinte:

[code] //subtração(na verdade ajusta os sinais e chama a adição…)
public static InteiroGigante subtrair(InteiroGigante a, InteiroGigante b) {

//.getInverso() retorna o mesmo número com sinal oposto, e não altera as variáveis do número original.
InteiroGigante resultado = InteiroGigante.adicionar(a, InteiroGigante.getInverso(b));

	return(resultado);
	
	
}[/code]

:arrow: o bug eh que ele devia retornar 3 - 3 = 0 , mas retorna -3 -3 = -6 :shock:

pq??? :frowning:

eu acho que é porque ambos os InteirosGigantes que eu utilizo no método subtrair estão ligados a uma mesma referência, aí ele altera os 2. ou algo assim…

Se não for, alguém aí sabe e pode me explicar ?

como eu faço para isto não acontecer ?

[]'s pessoal

É. Provavelmente é isso mesmo. Quando você está fazendo as operações(adicionar, subtrair, getInverso) você provavelmente quer que seu objeto original não mude.

Procure verificar que os metodos não mudem o objeto original, por exemplo você deve evitar copiando a referência da array. Ao inves, crie um novo array e tente copiar o conteúdo.

Se isso não te ajude, talvez você poderia mostrar mais do seu código aqui.

-Sami

O problema é mesmo este, qdo vc passa o objeto InteiroGigante está passando a referência para ele, ou seja, qualquer alteração em algum atributo dele vai modificar o estado do objeto.

Você pode armazenar o outro valor em uma variável auxiliar para não ocorrer esse problema.

os construtores:

[code]public class InteiroGigante {

private int[] número;
private int casasDoNúmero;
private int sinal;

private static final int POSITIVO = 1;
private static final int NULO = 0;
private static final int NEGATIVO = -1;

//construtores(início)

public InteiroGigante() {
	
	número = new int[40];
	casasDoNúmero = 1;
	sinal = 0;
	
}

public InteiroGigante(long inteiro) {
	
	número = new int[40];
	representarEmArray(inteiro);
	if(inteiro > 0) {
		sinal = 1;
	} else if(inteiro < 0) {
		sinal = -1;
	} else {
		sinal = 0;
	}
	
}[/code]

e alguns métodos que podem servir

[code] //retorna o oposto
public static InteiroGigante getInverso(InteiroGigante ig) {

	InteiroGigante inverso = ig.getMódulo();
	inverso.setSinal(ig.getSinal() * -1);
	return(inverso);
	
}
            public int getSinal() {
	
	return(sinal);
	
}

public InteiroGigante getMódulo() {
	
	InteiroGigante módulo = this;
	módulo.setSinal(POSITIVO);
	
	return(módulo);
	
}[/code]

e o método setSinal():

[code] private InteiroGigante setSinal(int novoSinal) {

	if(novoSinal == NEGATIVO || novoSinal == NULO || novoSinal == POSITIVO) {
		
		sinal = novoSinal;
		
	} else {
		
		System.err.println("Valor inválido para o sinal");
		
	}
	
	return(this);
	
}[/code]

eu não acho a parte do código que tá gerando esse bug, pra mim ele não devia alterar o objeto inicial, então olha aí mais código.

quando eu do o setSinal() ele sai alterando o sinal das outras refências tbm eh?

e se…

eu criar um construtor que crie um novo InteiroGigante a partir de outro para que eu não utilize apontador para outro InteiroGigante ele elimina essa referência??? resolve neh?

bom, vou tentar isso aqui…

qualquer coisa aviso, desculpaê se demoro pra entender as coisas, mas to com 1 mês e pouco de java e eh minha 1 linguagem… 0=P

vlw!

[quote=thiagossantos]quando eu do o setSinal() ele sai alterando o sinal das outras refências tbm eh?
[/quote]

Ele tah pegando apenas uma referência para o objeto InteiroGigante, qual quer modificação em suas propriedades vai modificar para os dois, pois estão aontando para o mesmo lugar.

era isso mesmo, incluí esse construtor no código e utilizei ele em alguns lugares aí resolveu.

[code] public InteiroGigante(InteiroGigante ig) {

	número = new int[40];
	númeroDeCasas = ig.getNúmeroDeCasas();
	for(int element = 40 - ig.getNúmeroDeCasas() ; element < 40 ; element++) {
		
		número[element] = ig.getDígito(element);
		
	}
	sinal = ig.getSinal();
	
}[/code]

brigadão