Getters e Setters

Ver Todos os Exercícios

Teoria

Introdução

Eai, tudo tranquilo contigo?

Nessa aula nós vamos entender o que são os métodos getter e setter. Você provavelmente já deve ter usado um método desse tipo, mesmo sem saber do que se tratavam. Nós vamos entender exatamente o que eles são, como implementá-los no nosso código e por que eles são importantes.

Então bora nessa!

Setters

Para entender como funciona um setter em C++, vamos começar com o seguinte exemplo: precisamos implementar um sistema de cadastro de alunos para uma escola. Esse sistema, a princípio, consiste de duas informações: o número da sua matrícula e a sua idade.

A matrícula de um aluno consiste num número de 5 algarismos, sendo os dois primeiros algarismos sempre 20 . Além disso, sabemos que todos os alunos dessa escola possuem idade entre 10 e 15 anos.

Se durante o cadastro de um aluno houver algum valor inválido para a idade ou para a matrícula, o valor 0 deverá ser admitido no lugar do valor colocado. Isso serve para que o sistema interno da escola saiba diferenciar aqueles que foram cadastrados de maneira errada.

Vamos, então, implementar esse sistema usando a programação orientada a objetos.

Inicialmente, vamos criar a classe a l u n o e colocar como atributos a matrícula e a idade. Como existem algumas restrições sobre os valores desses atributos, vamos deixá-los como privados.

Agora, para que seja possível que alguém cadastre um aluno, ela precisará instanciar um objeto dessa classe e modificar o valor desses atributos seguindo as regras impostas. Para isso, podemos criar métodos públicos para modificar os valores desses parâmetros. Esses métodos que possuem como objetivo definir o valor de um parâmetro para determinado objeto são chamados de setters.

Em C++, é considerado uma boa prática iniciarmos o nome desses métodos com “ S e t ”, mas não é algo obrigatório. Dessa forma, vamos declarar esses métodos na nossa classe:

Normalmente, esses métodos são do tipo v o i d , pois não há necessidade de algum retorno.

Prosseguindo, vamos especificar o que cada um deles faz, começando pelo método S e t M a t r i c u l a .

Dentro desse método, vamos checar a condição dos dois primeiros dígitos, ou seja, vamos utilizar o condicional i f para checarmos se o número passado como parâmetro está entre 20000 e 20999 . Em caso positivo, fazemos com que o parâmetro matrícula receba o valor passado, mas em caso negativo, faremos com que a matrícula seja nula.

Para o parâmetro S e t I d a d e , vamos fazer o mesmo processo de checar se o valor está dentro do esperado, que é entre 10 e 1

Com isso, nós escrevemos os setters da nossa classe.

Getters

Agora, se formos trabalhar com a nossa classe fora da região do código, é bem possível que em algum momento precisemos usar os valores dos atributos para saber se deu tudo certo com a nossa implementação ou para utilizarmos de alguma forma. Mas como vamos acessá-los se eles estão privados?

É nesse momento que entram os getters. Eles são métodos que retornam o valor dos atributos. Dessa forma, podemos saber o valor de um atributo, mas não podemos alterá-lo pelo getter, o que mantém a segurança desse atributo como um membro privado.

Dessa forma, vamos declarar os getters da nossa classe. Por convenção, vamos iniciar esses métodos com G e t :

Por fim, basta fazermos o método G e t M a t r i c u l a retornar o atributo m a t r i c u l a e o método G e t I d a d e retornar o atributo i d a d e .

Repara que são métodos bem simples, que só tem a função de retornar os valores das variáveis privadas mesmo!

Eaí, que tal colocar em prática os seus conhecimentos novos em g e t t e r s e s e t t e r s resolvendo as questões de fixação? Corre lá que eu estou te esperado.

Setters

Getters

Exercícios Resolvidos

Exercício Resolvido #1

Explique o que são g e t t e r s e s e t t e r s .

Passo 1

Eai, tranquilo?

Para uma melhor estruturação do nosso código, nós podemos fazer o encapsulamento, processo no qual separamos os membros de uma classe em privados e públicos.

No entanto, por muitas vezes podemos nos deparar com uma situação na qual temos que passar, fora do escopo da classe, um valor para um atributo privado. Nesse tipo de caso, usamos um S e t t e r , que é um método próprio da classe que modifica o valor de algum atributo de acordo com as especificações passadas.

Além disso, existe a possibilidade de precisarmos acessar um membro privado de uma classe, seja para saber o seu valor ou para utilizá-lo em alguma operação. Nessa situação, utilizamos um G e t t e r , que é um método da classe que retorna o valor de algum atributo privado.

Resposta

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

Exercício Resolvido #2

Crie uma classe chamada P o n t o 3 D . Essa classe deve possuir 3 atributos privados do tipo inteiro: p x , p y e p z . Além disso, essa classe deve possuir 2 métodos públicos. O primeiro, S e t P o n t o , deve receber 3 argumentos e passar esses valores para os 3 atributos da classe. O segundo, P r i n t P o n t o , deve imprimir esses valores no padrão ( p x ,   p y ,   p z ) .

Passo 1

Eai, tudo beleza?

Nessa questão nós teremos que criar uma classe para representar um ponto com 3 dimensões. Inicialmente, como será necessário imprimir mensagens na tela, vamos incluir a biblioteca iostream. Vamos também declarar a nossa classe P o n t o 3 D , com os parâmetros privados p x , p y e p z , e os métodos públicos S e t P o n t o e P r i n t P o n t o .

Passo 2

A seguir, vamos especificar o funcionamento do nosso método S e t P o n t o . Ele é um tipo de s e t t e r bem simples, no qual não é preciso checar nenhuma condição, apenas passar os valores recebidos como parâmetros para os atributos da classe.

Passo 3

Por fim, o nosso método P r i n t P o n t o deve imprimir as coordenadas no padrão dito no enunciado, ou seja, (px, py, pz).

Resposta

Exercício Resolvido #3

Faça a implementação de uma casa. Essa casa deve possuir os seguintes atributos privados:

  • quartos: deve possuir valor entre 1 e 5;
  • banheiros: valor entre 1 e 4;
  • rua: nome da rua na qual está localizada.

Para cada atributo, faça respectivos setters, para definir o seu valor respeitando as condições acima, e getters, para retornar os valores dos atributos.

Passo 1

Eai, tudo beleza?

Nessa questão nós precisamos fazer uma implementação de uma casa usando setters para atribuir valores para cada atributo e getters retornar cada atributo.

Vamos iniciar o nosso código criando a classe c a s a , com os seus atributos privados assim como foi descrito no enunciado e os métodos setters e getters públicos.

Passo 2

Vamos escrever o código de cada método setter. Começando pelo s e t Q u a r t o s . Nele, vamos verificar se o valor passado como parâmetro está entre 1 e 5 , que são os valores aceitáveis para a quantidade de quartos, e, em caso positivo, fazemos o atributo casa receber esse valor, mas em caso negativo, vamos imprimir uma mensagem na tela indicando que a quantidade de quartos passados é inválida.

Para o método s e t B a n h e i r o s , o processo é praticamente o mesmo.

Para o s e t R u a , a situação é mais simples, pois não há nenhuma restrição contra ele no enunciado, ou seja, basta fazermos o atributo r u a receber o valor passado como parâmetro.

Passo 3

Por fim, vamos fazer os getters. Cada um deles vai basicamente retornar o respectivo atributo:

Resposta

Exercício Resolvido #4

Implemente um sistema de conta bancária. Ele deve possuir um atributo privado do tipo double para armazenar o saldo da conta, que inicia com 0.0 por padrão, e 4 métodos públicos: o método s e t S a l d o , para definir o saldo da conta, o método g e t S a l d o , que retorna o valor do saldo, um método d e p o s i t a r , para acrescentar um valor ao saldo, e um método s a c a r , para retirar um valor do saldo. Considere que o saldo da conta não pode ser negativo.

Passo 1

Eai, tudo beleza?

Nessa questão, vamos implementar um sistema de conta bancária de acordo com as especificações do enunciado. Com base nisso, vamos criar uma classe C o n t a B a n c a r i a , adicionar o atributo privado s a l d o que inicializará com valor nulo e adicionar os métodos publicos descritos no enunciado.

Passo 2

Vamos definir o código do método s e t S a l d o . Como o valor recebido como parâmetro é do tipo d o u b l e , ele pode admitir valores negativos, o que seria incoerente. Portanto, vamos adicionar um condicional para chegar se o valor é positivo. Caso seja, faremos o s a l d o receber esse valor, mas em caso negativo, vamos imprimir uma mensagem indicando que o valor é indisponível.

Já para o getter g e t S a l d o , basta fazermos ele retornar o valor armazenado no parâmetro s a l d o .

Passo 3

Para o método d e p o s i t a r , vamos verificar se o valor passado para depósito é positivo, se for, vamos acrescentá-lo ao saldo. Em caso negativo, imprimimos uma mensagem indicando que o valor está indisponível para depósito.

No método s a c a r , para que o valor seja válido, ele deve tanto ser positivo quanto menor que o valor do saldo. Se essas condições forem verdadeiras, vamos reduzir esse valor do saldo, mas em caso negativo, vamos imprimir uma mensagem com o erro.

Resposta

Exercício Resolvido #5

Crie uma classe em C++ chamada R e l o g i o para armazenar um horário, composto por hora, minuto e segundo. A classe deve representar esses componentes de horário e deve apresentar os métodos descritos a seguir:

  • um método chamado setHora, que deve receber o horário desejado por parâmetro (hora, minuto e segundo);
  • um método chamado getHora para retornar o horário atual, através de 3 variáveis passadas por referência;
  • um método para avançar o horário para o próximo segundo (lembre-se de atualizar o minuto e a hora, quando for o caso). 

Passo 1

Eai, tudo beleza?

Nessa questão nós vamos fazer a implementação de um relógio utilizando os g e t t e r e s e t t e r . Vamos iniciar o nosso código declarando a classe, os seus atributos e os métodos.

Como vamos utilizar um getter para definir o horário, vamos deixar os atributos h o r a , m i n u t o e s e g u n d o privados, enquanto os métodos da classe serão privados.

Perceba que declaramos o g e t t e r na linha 10 como do tipo v o i d . Isso ocorre será por meio de referência, ou seja, passaremos endereços de memórias que receberam os valores das horas, minutos e segundos.

Passo 2

Vamos escrever o método s e t H o r a . No nosso relógio, vamos definir que as horas vão variar de 0 até 23, enquanto os minutos e os segundos vão de 0 até 59. Dentro do método, vamos analisar os valores recebidos então dentro do que definimos. Em caso positivo, cada atributo recebe o valor passado e, em caso negativo, vamos admitir o valor 0 como padrão.

Passo 3

Para o método g e t H o r a , vamos fazer cada endereço de memória passado receber o valor do atributo referente. Dessa forma, os valores dos atributos ficarão gravados nos endereço de memória passados como atributos, tornando possível que eles sejam acessado foda da região do código da classe.

Passo 4

No método avançar, temos que utilizar bastante os condicionais para podermos considerar cada caso. Vamos inicialmente checar se o valor dos segundos é diferente de 59. Caso seja, vamos apenas somar 1 ao seu valor.

Mas se ele for igual a 59, devemos zerar o seu valor e fazer a mesma análise para os minutos

No caso dos minutos ser igual a 59 , além de zerá-lo, devemos fazer a mesma análise para as horas e finalizar o método.

Resposta

Exercício Resolvido #6

Crie uma classe chama d a t a . Essa classe deve apresentar os seguintes atributos privados:

  • dia – número inteiro que varia de 1 até 31;
  • mês – número inteiro que varia de 1 até 12;
  • ano – número inteiro positivo.

Esses atributos devem ser inicializados com o valor 1.

Também deve conter os seguintes métodos públicos:

  • setData – Recebe valores para dia, mês e ano como parâmetros e altera os valores dos atributos caso os valores recebidos sejam válidos;
  • getDia – Retorna o dia;
  • getMes – Retorna o mês;
  • getAno – Retorna o ano.

Passo 1

Eai, tudo beleza?

Nessa questão nós vamos fazer uma simples aplicação de Getters e setters para um sistema de data. Para começarmos, vamos iniciar a nossa classe d a t a com os parâmetros d i a , m e s e a n o , todos do tipo inteiro e inicializados com valor 1 .

Além disso, vamos declarar o Setter e os getters:

Passo 2

Vamos definir o que o método s e t D a t a faz. Cada parâmetro recebido deve ser filtrado e, caso passe pela condição, vamos atribuir o seu valor a um atributo. O parâmetro d , referente ao dia, deve estar com valor entre 1 e 31 .

Desse mesmo modo, vamos checar se o valor de m está entre 1 e 12 e se a é positivo.

Passo 3

Por fim, vamos definir cada g e t t e r , fazendo com que ele retorne o atributo ao qual se refere.

Resposta

Exercício Resolvido #7

Um ar-condicionado funciona possui sensores que informam a temperatura do ambiente. Desse modo, quando alguém utiliza o controle remoto para definir a temperatura em que está o ambiente, ele consegue ajustar a sua potência de forma a ir modificando a temperatura do ambiente até que ela se estabiliza naquela que o usuário optou.

Pensando nisso, imagine que você está fazendo a programação de controlador para um ar-condicionado. Esse ar-condicionado precisa guardar 3 informações: a temperatura ambiente, a temperatura que ele deve deixar o ambiente e a potência na qual ele deve operar para alcançar essa potência. Além disso, ele deve ter funções para atribuir valor a cada atributo e deve possuir um modo de para retornar o valor desses atributos. Considere que a potência só precisa ter as informações sobre as temperaturas para ser calculada.

Com base nas informações dadas e nos seus conhecimentos de POO, declare uma classe A r C o n d i c i o n a d o , com os métodos e atributos necessários para realizar o que foi descrito.

OBS.: Não é necessário definir o que os métodos dessa classe fazem.

Passo 1

Eai, tudo beleza?

Nessa questão, nós vamos abstrair um ar-condicionado utilizando POO. Com base no que o enunciado nos disse, o ar-condicionado é definido por 3 parâmetros: temperatura ambiente, temperatura na qual ele deve deixar o ambiente e a potência na qual ele deve atuar.

Sabendo disso, vamos criar uma classe que possua esses 3 atributos:

Passo 2

Agora, vamos declarar as funções que serão responsáveis por atribuir valores para os parâmetros, ou seja, os nossos Setters:

Perceba que o método s e t P o t e n c i a foi o único que não recebeu parâmetros. Isso ocorreu porque o enunciado nos disse que ele precisa somente dos valores presentes nos outros dois parâmetros ( t e m p A m b i e n t e e t e m p E s c o l h i d a ) para calcular o valor da potência.

Passo 3

Por fim, vamos declarar os nosso getters. Como eles vão retornar os parâmetros, vamos declará-los como i n t , que foi o tipo que definimos para os parâmetros.

Resposta

Exercício Resolvido #8

Implemente um sistema de gerenciamento do salário de funcionários de uma empresa. Para isso, crie uma classe f u n c i o n a r i o . Cada objeto dessa classe deve ter um nome e um salário. Faça os métodos setters para atribuir valores para os atributos, assim como métodos getter que retornam esses métodos.

Leve em consideração que o salário mínimo de um funcionário dessa empresa é 1000,00 reais e o máximo é 8000,00 .

Passo 1

Eai, tudo tranquilo?

Vamos implementar um sistema para gerenciar os salários dos funcionários de uma empresa. Para isso, vamos criar a classe f u n c i o n a r i o , com os atributos privados n o m e , que vamos declarar como uma string, e salário, que será do tipo double. Vamos também declarar um setter e um getter para cada atributo.

Passo 2

Agora, vamos trabalhar no método g e t S a l a r i o . Nele, vamos checar se o valor passado como salário é um valor entre 1000 e 8000 . Caso o parâmetro seja menor que 1000 , vamos passar o valor mínimo para a variável e, caso ele seja maior que 8000 , vamos passar o valor máximo.

Agora, no s e t N o m e , não temos restrições para analisar, por isso, vamos apenas passar o valor recebido como atributo para o nosso parâmetro.

Passo 3

Por fim, vamos declarar os nossos getters, fazendo com que eles retornem os valores ao qual se referem:

Resposta