Minicurso C++ orientado a objetos CompPET 2015
Sobre C++ - Desenvolvida por Bjarne Stroustrup em 1979; - Derivada da linguagem C; - Elementos principais adicionados a linguagem C para gerar C++ é a representação a objetos. - Linguagem compilada; - Tipagem estática;
Orientação a Objetos É um dos paradigmas de programação mais utilizados atualmente. Sendo que, paradigmas diferem nos conceitos e abstrações utilizadas para representar os elementos de um programa e as etapas que compõem um cálculo. Facilita a manutenção do sistema. Facilita o reuso de código. Facilita a comunicação entre os envolvidos na produção do sistema por permitir a modelagem dos dados. Aproxima o real do implementado.
Tipos de dados Todas as variáveis em C++ devem ser declaradas antes de serem utilizadas. Em C++ existem os seguintes tipos básicos de dados: int float double char string Os modificadores short, long, unsigned são aceitos.
Operadores = +, -, *, /, % ++, - +=, -=, *=. /=, %= <, <=, >, >=, ==,!= &&,,!
A diretiva using Um namespace é uma coleção de definições de nome. É semelhante a um sobrenome. A maioria das bibliotecas padrão colocaram suas definições no namespace std. Portanto, para utilizar, por exemplo os comandos cout e cin teríamos que utilizar: std::cout<<"escrevendo na tela"; Por questão de praticidade utilizamos a diretiva using que permite que os nomes dentro de um namespace possam ser utilizados sem explicitar o qualificador. Utilizando using namespace std.
Entrada e saída padrão Em C++ a entrada e saída de informações se dão a partir de funções da biblioteca iostream. Para a entrada de dados (leitura de valores) utiliza-se o comando cin: Sintaxe: cin>>variavel; Pode-se utilizar o cin com múltiplas entradas: cin>>var1>>var2>>varn; O operador >> interpreta o " " como finalizador da entrada;
Entrada e saída padrão Para a impressão de dados utiliza-se o comando cout com o operador de inserção << : Sintaxe: cout<<"texto a ser escrito na tela"; Para saltar uma linha após a escrita utiliza-se o comando endl. Teríamos, portanto: cout<<"texto a ser escrito na tela"<<endl; Para imprimir uma variável e um texto coloca-se o operador de extração << entre eles: cout<<"texto "<<variavel<<endl;
Exemplo #include <iostream> using namespace std; int main() int n; cout<<"escrevendo na tela utilizando C++"; cout<<"digite um número"; cin>>n; cout<<"o número digitado é: "<<n<<endl; return 0; }
Tipo string Em C++ existe a classe string. Diversas funções para manipulação de strings estão na biblioteca iostream, entretanto também existem funções na biblioteca string (#include <string>) Variáveis do tipo string podem ser tratadas de maneira semelhante a tipos primitivos, portanto alguns operadores como + e == são válidos. Declaração: string str;
strings Como o cin identifica o como terminador, algumas vezes ele não é recomendado para leitura de strings. Usa-se portanto, a função getline. O getline precisa de dois parâmetros, o primeiro é o buffer de entrada e o segundo a variável onde será armazenada a string. getline(cin, str);
strings Algumas funções importantes para manipulação de strings são citadas abaixo: Considere duas strings str1 e str2: str1.size() - retorna o tamanho da string str1. str1.empty() - verifica se str1 é uma string vazia. str1.copy(str2) - copia o conteúdo da string str1 para a string str2.
strings str1.substr(pos, tam) - retorna a substring que começa na posição pos, de tamanho tam, da string str1. str1.replace(pos, tam, str2) substitui a substring que começa na posição pos, de tamanho tam, da string str1 pela string str2. str1.find(str2) - retorna a posição da primeira ocorrência da str2 na string str1, ou -1 se não encontrar.
Praticando com strings Exercício 1: Escreva um código que receba como entrada a sequência de DNA de N pessoas, um fragmento de DNA de outra pessoa e imprima quais dessas pessoas possuem o fragmento de DNA. Exercício 2: Incremente o código anterior para receber mais um fragmento de DNA. As pessoas que possuírem o primeiro fragmento (as que foram impressas no exercício 1) devem tê-lo substituído pelo segundo.
Praticando com strings Entrada Saída CGATGACGTC ATCGACTGCG TAGCATCGAC GATCAGATGC CATCTGACTG As pessoas 2, 5 possuem o fragmento CTG em seu DNA. CTG GACTACTGA CTAGTACTA TCGATGACT AGCTACGAT TCA Nenhuma das pessoas possuem o fragmento TCA em seu DNA.
Escopo de variáveis Escopo de uma variável nada mais é do que o alcance que essa variável tem. Uma variável pode ter escopo global, podendo ser acessada em qualquer parte do código, ou local, podendo ser acessada apenas em uma parte do código. Um escopo local é delimitado entre a abertura de chaves () e o seu fechamento (}) e pode ser definido em qualquer lugar do código.
Comandos de decisão If: int idade; cin>>idade; if(idade<12) cout<<"criança"<<endl; else if(idade<25) cout<<"jovem"<<endl; else if(idade<60) cout<<"adulto"<<endl; else cout<<"idoso"<<endl;
Laços de repetição For: int i; for(i = 0; i<10; i++) cout<<i<<" "; While: while(i<10) cout<<i<<" "; i++; }
Array Podemos declarar um array em C++ da mesma forma que declaramos na linguagem C. int elem[10]; No entanto, em C++ temos a biblioteca de vectores (#include <vector>), que nos permite utilizar arrays dinâmicos. vector<int> elem; Para adicionar uma nova posição ao vector, utilizamos a função push_back. elem.push_back(3); Para remover a última posição do vector, utilizamos a função pop_back. elem.pop_back();
Array O acesso aos elementos do vector é feito da mesma forma que na linguagem C. elem[0] = 3; Há várias funções úteis para manipulação de arrays na biblioteca de vector. elem.size() - retorna o tamanho do vetor elem. elem.clear() - remove todos os elementos do vetor elem. elem.empty() - verifica se o vetor elem está vazio.
Praticando Vector Exercício 3: Altere o código escrito no exercício 2 de forma a utilizar um vector para armazenar as informações das pessoas.
Aula 2 CompPET 2015
Struct A estrutura é um dos tipos de dados que podem ser definidas pelo programador. Ela é uma coleção de variáveis de tipos diferentes que são tratadas como um único item. As variáveis em estruturas podem ser acessadas com o operador. Declaração da estrutura - ex: struct exemplo int a; void atribuivalor(int b) a = b; } };
Struct Declaração e chamada da estrutura: int main() struct exemplo e1; e1.atribuivalor(2); printf("%d", e1.a); return 0; }
Praticando estruturas Exercício 4: Implemente as seguintes estruturas: pessoa que tem as seguintes variáveis: nome, cpf, endereço. aluno tem como variáveis uma estrutura pessoa e mais um número de matrícula e um vetor de disciplinas. crie funções para atribuir valores às variáveis e exibílos.
Programação Orientada a Objetos Um paradigma de programação pode ser definido como sendo uma abordagem de modelagem de um problema. A complexidade da implementação da resolução é altamente impactada pela escolha do paradigma.
Programação Orientada a Objetos Existem diversos paradigmas de programação: Procedimental Orientado a objetos Funcional Lógico Orientado a aspectos Algumas linguagens são multiparadigma, o que confere flexibilidade ao programador.
Programação Orientada a Objetos A linguagem C++ oferece suporte a dois paradigmas muito usados: - Paradigma procedural: - Estabelece um processo - Facilita a modularização - Se baseia na chamada de funções (procedure call) - Paradigma orientado a objetos: - Evoução da PP - Mais próxima do mundo real - Maior aproveitamento do código
Programação Orientada a Objetos O paradigma de programação OO se baseia na decomposição e interação de unidades de software. Essas unidades de software são denominadas objetos. A abstração, ou seja, o molde dessas unidades de software é chamado de classe.
UML Existem diversos modelos para representação de diagramas de maneira visual. Um deles é a UML (Unified Modeling Language). Em uma representação simplificada da UML, a classe é representada da seguinte maneira:
UML
Classes Classe é a definição dos elementos que formam o sistema, indicando suas características e funcionalidades. Uma classe é formada por atributos e métodos: Atributos: Indicam as caracteristicas do elemento. - Modificadores (public, private, protected) Métodos: Indicam as funcionalidades do elemento.
Classes A classe Pessoa mostrada no exemplo pode ser representada com UML da seguinte maneira:
Classes Em C++ uma classe pode ser definida de maneira semelhante a struct. Observe: class Pessoa Atributos int idade; string nome; void atribuivalores(int i, string s) idade = i; nome = s; } }; Métodos
Atributos Atributos são as variáveis de uma classe A declaração de atributos é feita de maneira similar a declaração de variáveis comum.
Atributos class Pessoa int idade; string nome; Atributos void atribuivalores(int i, string s) idade = i; nome = s; } };
Atributos Exercício: implemente uma classe carro com os seguintes atributos: - placa ano marca preço
Métodos Métodos são todas as funções definidas no escopo de uma classe. O método deve implementar uma operação ligada a sua classe. Ex: alteração de dados, operações envolvendo os atributos da classe, etc.
Métodos class Pessoa int idade; string nome; void atribuivalores(int i, string s) idade = i; nome = s; } }; Método
Exercício Crie o código de uma classe Carro. Ela deve representar a classe do diagrama a seguir:
Objetos Objeto: Exemplar (instância) de um elemento previamente definido por uma classe. Cada objeto armazena as informações específicas de um exemplar instanciado da classe.
Objetos Criação de um objeto no código: int main() Pessoa katty; katty.atribuivalores(30, Katheryn Elizabeth Hudson ); }
Objetos Exercício: implemente uma função main e nela crie um objeto carro com os seguintes valores: - placa: WOW-6031 ano: 2004 marca: Blizz Box preco: 29,90 Após criar e inicializar o objeto, imprima os valores na tela.
Aula 3 CompPET 2015
Objetos Alguns atributos pertencem a todos os objetos de uma classe. Eles são chamados atributos estáticos: Class Biblioteca static int numerodelivros; };
Objetos Em uma classe é possível deixar claro que o atributo a que se está referindo é aquele do objeto e não o passado como parâmetro. Para isso usamos o this: Class Biblioteca string codigobiblioteca; void setcodigobiblioteca(string codigobiblioteca) this->codigobiblioteca = codigobiblioteca; } };
Métodos Existem duas maneiras de implementar um método: Dentro da classe (chamado método inline); Fora da classe; Lembrando que pelo menos as declarações dos métodos devem estar dentro da classe.
Métodos class Carro void iniciadados(string p, int a, string m, float pr); }; Declaração do método void Carro::iniciaDados(string p, int a, string m, float pr) placa = p; ano = a; Implementação marca = m; do método preco = pr; }
Métodos class Carro void iniciadados(string p, int a, string m, float pr) placa = p; Declaração e ano = a; implementação marca = m; do método preco = pr; } };
Sobrecarga de métodos A linguagem C++ permite a sobrecarga de métodos. Fornecer duas ou mais definições diferentes para o mesmo nome de função. Quando se sobrecarrega um nome de função, as definições da função devem ter números diferentes de parâmetros ou alguns parâmetros de tipos diferentes. A linguagem resolve a sobrecarga de métodos de duas maneiras diferentes: Identidade perfeita; Identidade com conversão automática de tipo.
Sobrecarga de métodos class Sobrecarga public: double f(int n, double m) return n + m; } double f(double n, int m) return n * m; } }; int main() Sobrecarga c; std::cout << c.f(2,3); }
Exercício Crie uma classe funcionário que possua necessariamente os atributos remuneração diária e dias trabalhados. Crie nessa classe um método que calcule o salário do funcionário de acordo com os dias trabalhados. crie uma sobrecarga desse método de modo que possa somar uma bonificação ao salário calculado.
Construtores O construtor é um método que tem o mesmo nome da classe, é executado automaticamente toda vez que um objeto é criado e não pode ter retorno. O construtor de uma classe é um método utilizado para inicializar os atributos do objeto instanciado. Um método construtor pode ou não possuir argumentos.
Construtores Assim como os métodos, existem duas maneiras de implementar construtores: Construtores inline: Construtores implementados dentro da classe; Construtores: Construtores implementados fora da classe. Existe ainda a possibilidade de inicializar os atributos da classe na definição do construtor: class Carro Carro(): ano(2015) } };
Construtores class Pessoa int idade; string nome; void atribuivalores(int i, string s) idade = i; nome = s; } Pessoa(int i, string s) atribuivalores(i,s); } }; Construtor inline
Construtores class Pessoa int idade; string nome; Pessoa(int i, string s); void atribuivalores(int i, string s); }; Pessoa :: Pessoa(int i, string s) atribuivalores(i,s); } Construtor fora da classe
Construtores class Pessoa int idade; string nome; Pessoa(int i, string s); void atribuivalores(int i, string s); }; Pessoa :: Pessoa(): idade(30),nome( Katheryn Elizabeth Hudson ) } Construtor Inicializador
Construtores class Pessoa int idade; string nome; Pessoa(): idade(30), nome( Katheryn Elizabeth Hudson ) } void atribuivalores(int i, string s) idade = i; Construtor inicializador nome = s; inline } };
Construtores Utilizando construtores no código: int main() Pessoa pablo(24, Pablo Henrique ); }
Destrutores Destrutores são métodos utilizados para destruir (liberar memória) objetos instanciados. Destrutores são executados automaticamente ao final do bloco de execução em que o objeto se encontra, porém caso seja preciso pode-se destruir um objeto manualmente utilizando o operador delete.
Destrutores class Pessoa int idade; string nome; Pessoa(): idade(30), nome( Katheryn Elizabeth Hudson ) } void atribuivalores(int i, string s) idade = i; nome = s; } ~Pessoa() Destrutor } };
Destrutores Utilizando delete no código: int main() Pessoa katty; katty.atribuivalores(30, Katheryn Elizabeth Hudson ); delete katty; } Chama o destrutor
Sobrecarga de Construtores É possivel sobrecarregar métodos construtores, desde que cada um tenha argumentos diferentes. class Pessoa int idade; string nome; Pessoa(): idade(30),nome( Katheryn Elizabeth Hudson ) Pessoa(int i, string s); void atribuivalores(int i, string s); }; Sobrecarga Pessoa :: Pessoa(int i, string s) atribuivalores(i,s); }
Exercício Adicione um atributo departamento à classe funcionário. Crie um construtor que preencha os atributos de um objeto da classe funcionário. Crie uma sobrecarga do construtor para criar objetos de funcionários que ainda não foram alocados a nenhum departamento.
Aula 4 CompPET 2015
Encapsulamento Um dos fundamentos da orientação a objetos é restringir o acesso de uma classe a códigos que não tenham a ver com sua lógica. Esconder detalhes da implementação evita que o código de classes usuárias se torne dependente das classes usadas.
Modificadores de acesso Podemos evitar que uma classe faça alteração direta aos atributos de outras. Para isso, utilizamos os modificadores de acesso. São eles: public: qualquer código externo à própria classe possui acesso aos membros da classe com este modificador. private: nenhum código externo à própria classe possui acesso aos membros da classe com este modificador. protected: apenas as classes que herdam a própria classe possuem acesso aos membros da classe com este modificador.
Getters e Setters Para permitir o acesso aos atributos privados e/ou protegidos de uma classe, cria-se os métodos getters e setters. Getters são métodos que apenas retornam o valor de um atributo. Setters são métodos para atribuir um valor a um atributo.
Getters e Setters class Pessoa private: int idade; string nome; public: int getidade() return idade; } Método de acesso público
Getters e Setters string getnome() return nome; } void setidade(int idade) this->idade = idade; } void setnome(string nome) this->nome = nome; } }
Herança É o processo que permite criar uma classe que herde todas as características de outra já existente. É uma relação do tipo é-um. Uma classe que herda outra é chamada de classe derivada (classe filha) e a classe existente de classe base (classe pai). A definição de uma função-membro herdada pode ser alterada na definição da classe derivada.
Tipos de herança Classes filhas não possuem acesso à membros privados. Os modificadores mencionados se aplicam apenas aos membros públicos e protegidos. Herança pública: Membros da classe filha terão seus modificadores iguais aos da classe pai, exceto os membros privados. class Filha : public Pai
Tipos de herança Herança privada: Membros públicos e protegidos da classe pai serão membros privados na classe filha. class Filha : private Pai Herança protegida: Membros públicos e protegidos da classe pai serão membros protegidos na classe filha. class Filha : protected Pai
Exemplo Herança class Veiculo protected: int qtdpassageiros; string modelo; public: void setvalores(int qtdp, string model) qtdpassageiros = qtdp; modelo = model; } };
Exemplo Herança class Aviao : public Veiculo int nroasas = 2; int qtdturbinas; public: Aviao(int qtdt, int qtdp, string model) qtdturbinas = qtdt; qtdpassageiros = qtdp; modelo = model; } };
Exemplo Herança class Caminhao : protected Veiculo string carga; double massacarga, precocarga,precototal; public: setpreco() precototal = precocarga*massacarga; } };
Herança Quando manipula-se herança, ao implementarmos um construtor na classe derivada, devemos utilizar um construtor da classe-base, caso nenhum construtor seja especificado o construtor padrão será utilizado. class Veiculo Veiculo() } Veiculo(int qtdpassageiros) this->qtdpassageiros = qtdpassageiros; } };
Exemplo Herança class Caminhao : protected Veiculo Caminhao(double mc, double pc) massacarga = mc; precocarga = pc; } };
Exemplo Herança class Caminhao : protected Veiculo Caminhao(double mc, double pc, int qtdpassageiros): Veiculo(qtdPassageiros) Chamada do massacarga = mc; construtor da precocarga = pc; classe-base } };
Exercício Exercício 5 - Implemente as seguintes classes: pessoa que tem os seguintes atributos privados: nome, cpf, endereço. aluno que tem os atributos de pessoa e possui um número de matrícula e um conjunto de disciplinas, todos privados. crie métodos para atribuir valores aos atributos dessas classes e métodos para os imprimir na tela (getters e setters). Implemente os respectivos construtores inicializando os atributos com um valor padrão.
Herança Muitas vezes ao utilizar a classe-base, nem sempre os métodos desta classe atendem completamente a necessidade da classe derivada. Entretanto, alterar a classe pai não é uma boa ideia, porque provavelmente não é apenas uma classe filha que a utiliza. Devemos então redefinir o método, ou seja, criar um método na classe derivada com o mesmo nome da classebase e reescrevê-lo ou alterá-lo.
Sobrescrita de métodos Consiste em criar um novo método na classe filha contendo a mesma assinatura e mesmo tipo de retorno do método sobrescrito. O compilador sempre tentará utilizar o método mais próximo ao objeto em execução, ou seja, se existir o método na classe-base e na classe derivada, o compilador executará o da classe derivada. Não confundir com sobrecarga de métodos.
Sobrescrita de métodos Quando um método for redefinido na classe derivada ele pode chamar ou não o método da classe-base. Caso seja necessário chamá-lo, o fazemos por meio do operador de resolução de escopo (::).
Exercício Exercício 6 - Implemente as seguintes classes Funcionario com um método que calcule o salário do funcionário de acordo com os dias trabalhados. Gerente que herde a classe Funcionario e sobrescreva o método de cálculo do salário, atribuindo ao gerente 60% a mais.
Aula 5 CompPET 2015
Polimorfismo Polimorfismo (poli: muitas, morfismo : formas). Permite chamar um método de um objeto sem saber a classe exata desse objeto. Em C++, isso significa que uma única instrução pode chamar diferentes métodos.
Polimorfismo
Métodos virtuais É um método cujo comportamento pode ser sobrescrito em uma classe herdeira por uma função com a mesma assinatura. class Jogador virtual void imprimetipojogador(...) cout << Eu sou um jogador indeciso. <<endl; } };
Métodos virtuais class JogadorVolei: public Jogador void imprimetipojogador(...) cout << Eu jogo volei. <<endl; } };
Métodos virtuais class JogadorDota: public Jogador void imprimetipojogador(...) cout << Eu jogo dota. <<endl; } };
Métodos virtuais A diferença de sobrescrição de um método comum e de um método virtual, é que sempre será chamada a implementação da classe derivada e não da classe base em tempo de execução.
Métodos virtuais int main () vector <Jogador*> jogadores; JogadorVolei jv; JogadorDota jd; jogadores.push_back(&jv); jogadores.push_back(&d); for (int i = 0; i < jogadores.size(); i++) jogadores[i]->imprimetipojogador(); } }
Métodos virtuais Resultado: Eu jogo volei. Eu jogo dota.
Métodos virtuais E se o método imprimetipojogador não fosse declarado como virtual?
Métodos virtuais Resultado: Eu sou um jogador indeciso. Eu sou um jogador indeciso.
Métodos virtuais puros Um método virtual é tido um método virtual puro quando a classe não especifica sua implementação. Ex.: class Jogador public: virtual void imprimetipojogador() = 0; };
Polimorfismo - Exercício Problema: Um fórum virtual oferece um serviço de chats para os jogadores. Existem diversos tipos de jogadores, mas todos possuem em comum: nome, idade e a quantidade em horas semanais que passa jogando. Os jogadores podem ser jogadores de futebol ou de Temple Run. Os jogadores de Temple Run possuir as informações: dispositivo movel que usam e maior pontuação. Cada jogador deve ser apresentado mostrando a seguinte tela quando invocado o método dadosjogador:
Polimorfismo - Exercício Exemplo jogador de Futebol de botão: Nome do jogador: Katy Perry Idade: 81 anos. Horas jogando por semana: 4 horas. Nome do jogo: Futebol de Botão. Exemplo jogador de Temple Run: Nome do jogador: Leeroy. Idade: 30 anos. Horas jogando por semana: 20 horas. Maior pontuação: 3600. Nome do jogo: Temple Run. Dispositivo: Android.
Classes Abstratas Uma classe abstrata é uma classe que não pode ser instanciada, mas que seus descendentes podem ser.
Classes Abstratas Em C++, uma classe abstrata é criada pela declaração de pelo menos um método abstrato (pure virtual). virtual void metodoabstrato(...) = 0; Toda operação abstrata utiliza acoplamento dinâmico, ou seja, sua execução é decidida em tempo de execução. Classes abstratas que possuem pelo menos um método virtual puro não pode ser utilizadas para instanciar objetos, e são utilizadas apenas como Interface.
Herança Múltipla Na linguagem C++ a herança múltipla é aceita, ou seja, uma classe pode herdar as características de mais de uma classe-base. É preciso bastante cuidado ao implementar códigos com herança múltipla para evitar a ambiguidade. Se uma classe filha herdar de classes pai que tem métodos e/ou atributos com o mesmo nome, erros de incompatibilidade são gerados.
Herança Múltipla A sintaxe da herança múltipla é similar a herança simples, observe: class X }; class Y }; class Z: public X, public Y };
Herança Múltipla Se por acaso houver ambiguidade devido a herança múltipla, pode-se corrigir utilizando o operador de resolução de escopo: class X void imprime(); }; class Y void imprime(); }; class Z: public X, public Y };
Herança Múltipla int main() Z obj; Z.print(); //Gera erro de ambiguidade Z.X::imprime(); Z.Y::imprime(); }
Exemplo Herança Múltipla
Aula 6 CompPET 2015
Exceções Uma exceção é um erro que acontece durante a execução do programa. Uma possibilidade para verificar erros é com if e else, porém não é muito viável, existem maneiras melhores.
Exceções int main() int a,b,divisao; cin>> a; cin>>b; divisão = a/b; cout<< resultado <<divisao<<endl; } O código irá parar de funcionar caso seja atribuído 0 à variável b.
Exceções int main() int a,b,divisao; cin>> a; cin>>b; if(b==0) cout<< divisão por zero <<endl; else divisao = a/b; cout<< resultado <<divisao<<endl; } }
Exceções Uma forma melhor de evitar erros inesperados é utilizar o tratamento de exceções. Vantagens de utilizar exceção: Separação do código que identifica o erro e o código que trata o erro; Tratamento de erros localizada; Aumento da confiabilidade da aplicação.
Exceções A captura e tratamento de exceções é feita com os comandos try, catch, throw : try: delimita o bloco de código que será protegido; catch: delimita o final de um bloco protegido e o início das instruções de tratamento de exceções; throw: gera novas exceções ou propaga uma já existente
Exceções try //Código passivo de gerar exceção throw (exceção) } catch(int e) // código que será executado caso // haja lançamento de exceção }
Exceções int main() int a,b,divisao; try cin>> a; cin>>b; if(b==0) throw b; divisao = a/b; cout<< resultado <<divisao<<endl; } catch(int e) cout<< valor <<e<< inválido para b ; }
Exceções - Exercício Suponha que a empresa que mantém o fórum de jogadores do exercício anterior tenha recebido muitas queixas contra jogadores de mais de 89 anos. Eles estão incomodando os jogadores de Temple Run, dizendo que eles só ficam olhando para o celular. Como os jogadores de Temple Run são maioria, a diretoria pediu para que você impeça os velhinhos de entrar no fórum. Dessa forma, crie uma exceção que impeça que jogadores maiores de 80 anos se cadastrem no fórum.
Classes de Exceções O comando throw pode lançar qualquer tipo de exceção. Pode-se pegar uma exceção qualquer utilizando... como parâmetro do catch. Dessa forma é comum definir uma classe de exceções cujo objeto contém a informação que se deseja capturar no bloco catch.
Classes de Exceções class ByZero private: string a = divisão por zero ; public: void imprimeerro() cout<< Ocorreu um erro: <<a<<endl; } }; Observe o comando throw que a exceção da classe: throw ByZero();
Exceções int main() int a,b,divisao; try cin>>a>>b; if(b==0) throw ByZero(); divisao = a/b; cout<<"resultado = "<<divisao<<endl; } catch(byzero e) e.imprimeerro(); } return 0; }
Classes de Exceções Assim como podemos definir nossa próprias classes de exceção, existem as classes de exceções padrões: exception: a classe base para todas as exceções lançadas. logic_error: Informa erros lógicos (por exemplo: erros de tamanho, argumentos inválidos). runtime_error: Informa erros de runtime que só poderiam ter sido detectados durante a execução (por exemplo: overflow).
Classes de Exceções - Exercício Crie uma classe de exceção para o exercício anterior.
Templates Templates são ferramentas que permitem definir funções e classes que possuem como parâmetros variáveis de tipos não especificados. Desta forma, podemos fazer: Funções com argumentos mais genéricos. Classes muito mais generalizadas.
Templates - Funções Função para soma de inteiros: int soma(int var1,int var2) int res = var1 + var2; return res; } Função para soma de strings: string soma(string var1, string var2) string res = var1 + var2 return res; }
Templates - Funções Função para soma de quaisquer tipos: template <class tipo> tipo soma(tipo var1,tipo var2) tipo res = var1 + var2; return res; }
Templates - Funções Outro exemplo: template <class X> void trocavalores(x &var1,x &var2) X temp; temp = var1; var1 = var2; var2 = temp; }
Templates - Classes Classe genérica: template <class tipo> class calculadora tipo multiplica(tipo x, tipo y) return x*y; } tipo soma(tipo x, tipo y) return x+y; } };
Templates - Classes Instanciação da classe: int main() calculadora<int> calc; int n1 = 3, n2 = 5; cout << calc.multiplica(n1, n2) << endl; cout << calc.soma(n1, n2) << endl;; return 0; }
Exercício de Templates Continue o exemplo do jogador. Implemente uma nova classe de usuário que será o moderador do fórum. Usando a ideia de templates, faça um método que receba qualquer tipo de usuário do fórum e imprima uma saudação com seu nome. Ex: Olá fulano de tal!
Funções e bibliotecas interessantes istream::ignore(qtd, delim): retira caracteres de entrada, até que qtd caracteres sejam retirados ou um caracter seja igual a delim cin.ignore(1,'\n'); Stack Queue Algorithm