Neste tutorial de nosso curso de C++, vamos usar mais um exemplo de Classe e Objeto, dessa vez pare entender melhor o uso de funções setters e getters, bem como deixar nosso código mais seguro, através da keyword const.
Funções Get e Set em Orientação a Objetos
Vamos fazer outro exemplo de classe! Agora vamos trabalhar com um retângulo, que diferente do quadrado que só tem um lado de valor igual, o retângulo preciso do valor de dois lados. Vamos chamar de length (comprimento) e width (largura).
A função que pega o valor da área, vamos chamar de getArea() e a que retorna o valor do perímetro de getPerimeter...de get, que aqui significa pegar, obter, acessar...
Como nossas variáveis são privadas, afinal é uma questão de segurança que ninguém de fora mexa nem veja elas, vamos precisar de funções para definir o valor dessas variáveis, serão as setLength() e a setWidth()...de set...falamos 'setar', que significa definir, mudar.
Veja como fica nosso código:
#include <iostream> using namespace std; class Rect { private: double length, width; public: double getArea(); double getPerimeter(); void setLength(double); void setWidth(double); }; double Rect::getArea() { return length * width; } double Rect::getPerimeter() { return 2*(length+width); } void Rect::setLength(double l) { length = l; } void Rect::setWidth(double w) { width = w; } int main() { Rect r; double var; cout<<"Comprimento: "; cin >> var; r.setLength(var); cout<<"Largura: "; cin >> var; r.setWidth(var); cout<<"Area: " << r.getArea() << endl; cout<<"Perimetro: " << r.getPerimeter() << endl; return 0; }
Na main(), instanciamos um objeto 'r' do tipo Rect, e declaramos uma variável 'var' que vai receber os valores que o usuário vai digitar, pra os valores do comprimento e largura.
Primeiro ele digita o valor para o comprimento, e setamos esse valor através da setLength().
Depois ele digita o valor para a largura, e setamos esse valor através da setWidth().
Depois é só exibir o valor da área e do perímetro, através das getArea() e getPerimeter().
Ou seja, usamos getters e setters para acessar e mudar as variáveis. Veja novamente: ninguém no mundo externo, nem o melhor hacker do planeta, vai ter acesso direto a essa variáveis, somente através das funções de set e get.
Segurança da Informação com Orientação a Objetos
"Ué, a gente não tem acesso as variáveis diretamente, mas temos através das funções de Set e Get, que é a mesma coisa".
Bom, quase, mas tem um fundo de razão. Você ainda precisaria adivinhar o nome dessas funções, pra ter acesso a elas, mas não discordo de você, essa segurança toda ainda não ficou à prova.
Um exemplo: um hacker danadinho poderia muito bem definir valores negativos para os lados do retângulo, o que é um absurdo! Os lados de um retângulo devem ser positivos!
É aí que entra a mágica da orientação a objetos! Vamos alterar nossas funções de setLength() e setWidth(), vão ficar assim:
void Rect::setLength(double l) { while(l<=0){ cout << "Comprimento negativo! Digite um valor válido: "; cin >> l; } length = l; } void Rect::setWidth(double w) { while(w<=0){ cout << "Largura negativa! Digite um valor válido: "; cin >> w; } width = w; }
Amigos, enquanto valor de l ou w for negativo, vai cair dentro do while e só sai desse while quando o valor digitado for maior que 0, e não tem papo, pode ser o melhor hacker do mundo, ele não vai driblar isso.
A palavra-chave const em Orientação a Objetos
Como dissemos, o objetivo das funções getters é simplesmente pegar valores, acessar essas informações, jamais, nunca, alterá-la.
Você pode trabalhar na tesouraria de uma empresa e disponibilizar a função getSalario() pro restante da empresa, para cada um visualizar o valor do salário...mas em hipótese alguma essas pessoas devem poder alterar o valor apresentado (no caso, o salário...imagina que maravilha seria poder alterar seu salário?)
Uma maneira de garantir que essas funções são apenas de acesso, é usar a keyword const, tanto no cabeçalho dentro da definição de classe como na declaração da função.
Veja agora como fica nosso código todo completo, seguro, lindo e maravilhoso:
#include <iostream> using namespace std; class Rect { private: double length, width; public: double getArea() const; double getPerimeter() const; void setLength(double); void setWidth(double); }; double Rect::getArea() const { return length * width; } double Rect::getPerimeter() const { return 2*(length+width); } void Rect::setLength(double l) { while(l<=0){ cout << "Comprimento negativo! Digite um valor válido: "; cin >> l; } length = l; } void Rect::setWidth(double w) { while(w<=0){ cout << "Largura negativa! Digite um valor válido: "; cin >> w; } width = w; } int main() { Rect r; double var; cout<<"Comprimento: "; cin >> var; r.setLength(var); cout<<"Largura: "; cin >> var; r.setWidth(var); cout<<"Area: " << r.getArea() << endl; cout<<"Perimetro: " << r.getPerimeter() << endl; return 0; }
<3
ResponderExcluir