Classes: Mais Sobre Métodos. Funções Set e Get
Esta aula dará continuidade aos conceitos básicos da orientação a objetos e Classes, especificamente apresentando métodos parametrizados e os métodos Set e Get, que permitem acesso a atributos privados de uma classe.
MÉTODOS
Como brevemente visto na aula passada, métodos são as funções-membro de uma classe, permitindo o acesso aos atributos de uma classe e manipulando-os. Na aula passada apenas métodos não parametrizados foram apresentados, porém, como qualquer função, uma função-membro pode receber parâmetros. Observe o Programa 1 onde uma classe com um método não parametrizado é apresentado.
#include <iostream> #include <cmath> using namespace std;
class conversor {
public:
float f; float Lm; float Vi; float R;
float calcD1(void); };
float conversor::calcD1(void) {
return sqrt((2*Lm*f)/R); //calculo D1 }
int main(void) {
conversor buck_boost;
buck_boost.f = 20e3; buck_boost.Lm = 10e-9; buck_boost.Vi = 34; buck_boost.R = 100;
cout << "O Valor da razao de conducao do Diodo e' " << buck_boost.calcD1() << endl; system("PAUSE");
return 0;
}
Programa 1 Método sem parâmetros.
O exemplo utilizado, não por acaso, é muito semelhante a um exercício da primeira lista. No Programa 1 uma classe conversor é criada para representar um tipo de conversor estático. A classe possui quatro atributos e um método. O método calcula o valor da chamada razão de condução do diodo, D1.
A classe do Programa 1 será agora modificada, incluindo um método que retorna o ganho estático do conversor.
#include <iostream> #include <cmath> using namespace std;
class conversor {
public:
float f; float Lm; float Vi; float R;
float calcD1(void); float calcGanho(float D); };
float conversor::calcD1(void) {
return sqrt((2*Lm*f)/R); //calculo D1 }
float conversor::calcGanho(float D)
{ //o método calcula o ganho em função da razão cíclica float Ddi;
Ddi = calcD1(); //aqui eu posso chamar diretamente o metodo... if( D+Ddi > 1) return D/(1-D);
else return D/Ddi; }
int main(void) {
conversor buck_boost;
buck_boost.f = 20e3; buck_boost.Lm = 10e-6; buck_boost.Vi = 34; buck_boost.R = 100;
cout << "O Valor da razao de conducao do Diodo e' " << buck_boost.calcD1() << endl; cout << "O Ganho estatico deste conversor para D = 0.5 e' "
<< buck_boost.calcGanho(0.5) << endl; system("PAUSE");
return 0;
}
Programa 2 Método com parâmetros.
Observe que o método calcGanho deve receber um parâmetro, que no caso é a razão cíclica do conversor.
Atente que na implementação do método calcGanho a função-membro calcD1 é utilizada, e da mesma forma que os atributos, não é necessário qualquer declaração adicional, uma vez que é informado que a função calcGanho faz parte da classe conversor.
Exercício 1 Crie uma classe simples que represente um μC (microcontolador). A classe deverá possuir como atributos a frequência nominal de operação do clock principal do μC, o número médio de ciclos para realizar uma operação e o tamanho (em kbytes) de memória RAM.
Exercício 2 Escreva um método para a classe criada no exercício anterior que retorna o número de operações que o μC pode realizar por segundo em MIPS (Milhões de Instruções por Segundo).
FUNÇÕES SET E GET
Foi mencionado na aula passada que os membros de uma classe podem ser privados e públicos, e que membros privados só podem ser acessados na classe, i.e., por funções-membro da classe1
Programa 3
. Porém, pode-se declarar um método público que permite o acesso e manipulação de um atributo privado. Estude com cuidado o :
#include <iostream>
using namespace std;
class hipotetica {
private:
int var; //var é privada.... public:
void atribuiVar(int a); int obtemVar(void); void printVar(void); };
void hipotetica::atribuiVar(int a) {
var = a; //a atribuição é valida (ocorre dentro da classe) }
int hipotetica::obtemVar(void) {
return var; //o valor é diretamente retornado. }
void hipotetica::printVar(void) {
cout << "Valor de Var: " << var << endl; }
int main() {
hipotetica obj;
obj.atribuiVar(23); //atribuição feita utilizando método. obj.printVar();
obj.atribuiVar(53);
cout << "Obtendo o valor com funcao: " << obj.obtemVar() << endl; system("PAUSE");
return 0; }
Programa 3 Manipulando atributos privados.
Veja que a função que atribui o valor a var é pública, desse modo, ela pode ser utilizada normalmente fora da classe. O mesmo ocorre com as outras duas funções no programa.
No Programa 3, os métodos que modificam atributos privados não estão identificados como normalmente são encontrados em programas profissionais. Uma função pública criada para a manipulação dos dados privados de uma classe é geralmente identificada com os prefixos get ou set.
As funções get são normalmente chamadas de funções de acesso e as funções set são
chamadas de funções modificadoras. O Código 1 apresenta como a classe utilizada no Programa 3
normalmente seria encontrada em programas escritos em C++.
class hipotetica {
private:
int var; //var é privada.... public:
void setVar(int a); int getVar(void); void printVar(void); };
void hipotetica::setVar(int a) {
var = a; //a atribuição é valida (ocorre dentro da classe) }
int hipotetica::getVar(void) {
return var; //o valor é diretamente retornado. }
void hipotetica::printVar(void) {
cout << "Valor de Var: " << var << endl; }
Código 1 Funções set e get.
Observe que as funções getVar e setVar não realizam qualquer tipo de verificação ou
manipulação adicional nos dados.
#include <iostream> #include <cmath>
using namespace std;
class filtroRC {
private:
float f_corte; //polo do filtro.... float R;
float C; public:
void zera(void); //logo logo veremos construtores... void setR(float aux);
void setC(float aux); float getF_Corte(void); };
void filtroRC::zera(void) {
R = C = f_corte = 0; }
void filtroRC::setR(float aux) {
R = aux;
if ( R && C ) f_corte = 1/(R*C); //se R e C diferente de 0 calcula f }
void filtroRC::setC(float aux) {
C = aux;
if ( R && C ) f_corte = 1/(R*C); //se R e C diferente de 0 calcula f }
float filtroRC::getF_Corte(void) {
return f_corte/(2*M_PI); //retorna frequência de corte em Hz... }
int main() {
filtroRC f1; float a; f1.zera();
cout << "Digite a Resistencia do filtro: "; cin >> a; f1.setR(a);
cout << "Digite a Capacitancia do filtro: "; cin >> a; f1.setC(a);
cout << "A frequencia de corte do filtro e': " << f1.getF_Corte() << "Hz\n"; system("PAUSE");
return 0; }
Programa 4 Exemplo de funções set e get.
Exercício 4 Crie uma classe simples que represente um Diodo Zener. Alguns dos principais atributos de um diodo deste tipo são: Corrente Máxima, Resistência Zener (rz) e Tensão Zener (Vz).
Sabendo que a relação tensão-corrente de um diodo Zener pode ser aproximada pelas relações:
z
z z
z
V V
I V V I r
r −
= ∴ = + ⋅
Onde I é a corrente que flui no Diodo Zener e V a tensão aplicada ao diodo.
Na classe, todos os atributos devem ser privados.
Faça métodos que retornam a corrente e a tensão no diodo zener. O método que retorna a corrente deve receber como parâmetro a tensão atual aplicada ao diodo. O método que retorna a tensão deve receber a corrente no diodo como parâmetro.
Faça um método que calcula e retorna a máxima tensão que se pode aplicar ao diodo (levando em consideração a relação tensão-corrente e a máxima corrente do diodo zener).
Faça um método que calcula e retorna a potência máxima dissipada no diodo zener.