Exercícios Resolvidos de Sobrecarga de operadores

Ver Teoria

Enunciado

Defina uma classe que representa um círculo com um método privado que calcula a distância entre os centros de dois círculos.

O círculo deve ser iniciado por no momento que for instanciado por um construtor que receba o raio e a posição x , y do centro.

Sobrecarregue o operador ^ para informar se há ou não intersecção entre dois círculos.

Teste usando o círculo c 1 de raio 1 e centro ( 0,0 ) e o círculo c 2 de raio 4   e centro ( 3 , 4 ) .

Passo 1

Beleza, pessoal. A questão quer que a gente desenvolva uma classe que instancie um círculo usando um construtor, e que use o operador ^ para verificar interseção entre dois círculos.

Para verificar se dois círculos se interceptam precisamos considerar a distância entre os centros d c 1 c 2 e os raios r 1 e r 2 das circunferências:

Mas vamos começar pelo cabeçalho!

Vamos incluir a < c m a t h > para facilitar as contas que vamos fazer.

Passo 2

Beleza, partimos agora pra criação da classe

Usamos o comando c l a s s e para desenvolver uma classe chamada C i r c u l o . No contexto privado dessa classe vamos declarar três atributos, R para o raio e X e Y para a posição do centro da circunferência:

Ainda dentro do contexto privado vamos desenvolver um método chamado d i s t a n c i a que calcula a distância entre este círculo e um segundo círculo.

Nós já temos acesso aos dados de um dos círculos, mas vamos precisar receber o segundo círculo como argumento da função.

Matematicamente, a distância entre o centro dos dois círculos é dada por:

c 1 c 2 - = x 1 - x 2 2 + y 1 - y 2 2  

Vamos implementar isso no nosso código. Criamos as variáveis auxiliares d e l t a _ X e d e l t a _ Y que armazenam a subtração dos atributos dos dois círculos.

Em seguida usamos as funções p o w e s q r t (contidas no cabeçalho < c m a t h > ) para calcular a distância, e armazenamos na variável auxiliar d i s t . O método é finalizado retornando o resultado de d i s t

Passo 3

Show de bola, agora vamos mudar nossa classe pro contexto público, e vamos desenvolver um construtor.

Não se esqueça que para fazer um construtor é só declarar um método sem tipo e com o mesmo nome da classe. 😉

Esse construtor irá receber três parâmetros r a i o , x e y , e usaremos esses argumentos para preencher os valores do objeto.

Passo 4

Agora vamos para a parte principal da questão. Vamos desenvolver uma sobrecarga no operador ^ para informar quando dois círculos possuem intersecção. Para isso o operador ^ é binário.

Note o seguinte, o exercício não pede a quantidade de interseções. Apenas quer saber se as interseções existem ou não, em outras palavras, se a existência de interseção é verdadeira ou falsa. Essa interpretação diz pra gente que o resultado de ^ é um valor booleano.

Outra coisa é que os valores que vamos trabalhar são o raio, e a posição x , y , que são atributos privados. Então vai ser mais fácil desenvolver a sobrecarga como função-membro da classe.

Então, mãos à obra: o método de sobrecarga é do tipo b o o l , usamos a palavra-chave o p e r a t o r e o símbolo ^ para indicar o operador que será sobrecarregado, e recebe um objeto da classe C i r c u l o como argumento.

Lembre-se que em sobrecargas como função-membro o primeiro argumento é a própria classe, e por isso só precisamos de um único argumento como parâmetro.

Agora vamos desenvolver o corpo do método de sobrecarga. A questão só quer saber da existência de intersecções, então basta a gente usar um i f - e l s e para testar os seguintes dois casos:

Vamos testar os dois casos em que não existe interseção. Caso nenhum deles seja verdadeiro, então a interseção existe.

S E   d i s t   >   r m a i o r +   r m e n o r   E N T A O   n ã o   e x i s t e   i n t e r s e c ç ã o S E   r m a i o r >   d i s t   +   r m e n o r   E N T A O   n ã o   e x i s t e   i n t e r s e c ç ã o S E   N A O   e n t ã o   e x i s t e   i n t e r s e c ç ã o

Mas antes vamos precisar definir qual é o maior e o menor raio. Pra isso usamos as funções m a x ⁡ ( ) e m i n ⁡ ( ) presentes na < c m a t h > . E usando o método d i s t a n c i a calculamos a distância entre os centros das circunferências.

E isso finaliza a sobrecarga da classe, e podemos finalizar a classe.

Passo 5

Agora só nos resta testar, pra ver se deu tudo certo.

Vamos criar dois objetos do tipo C i r c u l o , com os valores determinados no enunciado da questão: c 1 de raio 1 e centro ( 0,0 ) e o c 2 de raio 4   e centro ( 3,4 ) .

E agora vamos utilizar a operação c 1 ^ c 2 . Usando o c o u t podemos imprimir uma mensagem e o resultado.

E o resultado é:

Pra não ficar nenhuma dúvida, eu plotei essas circunferências numa calculadora gráfica e temos o seguinte:

O que mostra que nosso programa está funcionando.

Resposta

Ei, a resposta está no passo a passo :)