excepções e vários
………..varios, exercicios excepções (a25)
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>
using namespace std;
void funcao()
{
double dX = -23.99;
cout << "se funcao : antes excepcao " << endl;
//se não houver excepções corre tudo bem
//throw - 1; //sai aqui em estado de erro, lançada a execpção que não é tratata
//ou
//throw "um texto que e erro..";//sai aqui em estado de erro, lançada a execpção que não é tratata
//ou
//throw dX; //sai aqui em estado de erro, lançada a execpção que não é tratata
cout << "se funcao : depois excepcao " << endl;
}
int main()
{
cout << "\n inicio do main" << endl;
funcao();
cout << "\n fim do main" << endl;
return 0;
}
………..varios, exercicios excepções (a25)
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>
using namespace std;
class minhaExcepcao
{
const char* const descricao;
public:
minhaExcepcao(const char * const msg =0):descricao(msg){}
};
void funcao2()
{
double dX = -23.99;
cout << "se funcao : antes excepcao " << endl;
//esta versão também não adianta..
throw minhaExcepcao("algo aconteceu");
cout << "se funcao : depois excepcao " << endl;
}
int main()
{
cout << "\n inicio do main" << endl;
funcao2();
cout << "\n fim do main" << endl;
return 0;
}
………..varios, exercicios excepções (a25)
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>
using namespace std;
class Erro
{
};
void funcao3()
{
cout << "se funcao : antes excepcao " << endl;
try
{
//criação artifical de um erro de uma excepção com o uso do throw
//ou
//sendo executado o primeiro thorw e interrompe este try
throw -1;
//ou
throw "primeira linha de comentario";
//ou
throw Erro(); //esta excepção não é tratada num catch, logo termina em erro, mesmo com a class estabelecida
//ou
//se nao for lançada nenhuma excepção então tbm não vai ser executado nenhum catch, e é porque está tudo bem
}
catch (int x)
{
//e é sempre executado no máximo um catch
cerr << "apanho o valor int da excepcao: " << x << endl;
}catch(const char * s)
{
cerr << "apanho o valor char da excepcao: " << s << endl;
}
cout << "se funcao : depois excepcao " << endl;
}
int main()
{
cout << "\n inicio do main" << endl;
funcao3();
cout << "\n fim do main" << endl;
return 0;
}
………..varios, exercicios excepções (a25)
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>
using namespace std;
int main()
{
cout << "\n inicio do main" << endl;
try
{
throw - 1;
}
catch (int x)
{
//e é sempre executado no máximo um catch
cerr << "apanho o valor int da excepcao: " << x << endl;
}
catch (double)
{
cerr << "apanho o valor double da excepcao: "<< endl;
}
catch (const string & str)
{
cerr << "apanho o valor string da excepcao: " << str << endl;
}
cout << "\n fim do main" << endl;
return 0;
}
………..varios, exercicios excepções (a25)
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>
using namespace std;
class denominadorNull
{
public:
string sobre()
{
return string("denominador nulo\n");
}
};
class foraDosLimites
{
public:
string sobre()
{
return string("fora dos limites\n");
}
};
double divisao(int numerador, int denominador)
{
if(!denominador)
{
throw denominadorNull();
}
return static_cast<double>(numerador) / denominador;
}
int main()
{
cout << "\n inicio do main" << endl;
int a[4] = { 10,11,12,13 };
int index = 1, d;
while(index >=0)
{
cout << "qual o index: ";
cin >> index;
cout << "qual o denominador: ";
cin >> d;
try
{
//ou
//throw "aaa";
//ou
if (index < 0 || index >= 4) throw foraDosLimites(); //e interrompe, não foi resolvido nao existe um catch
//se correr bem continuo
cout << "resultado: " << divisao(a[index], d) << endl;
}
catch (denominadorNull & dn)
{
cerr << dn.sobre(); //depois disto considera-se resolvido
}
catch(foraDosLimites & fl)
{
cerr << fl.sobre(); //depois disto considera-se resolvido
}
catch (...) //apanha todos os outros erros
{
cerr << "qualquer outro erro\n"; //depois disto considera-se resolvido
}
}
return 0;
}
………..varios, exercicios excepções (a25)
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>
using namespace std;
class baseErro
{
public:
virtual void oque()
{
cout << "baseErro" << endl;
}
};
class derivadaErro : public baseErro
{
public:
virtual void oque()
{
cout << "derivadaErro" << endl;
}
};
void funcao6()
{
throw derivadaErro();
}
int main()
{
try
{
funcao6();
}
catch (baseErro b) //não é usada a derivada mas sim a base,
//não existe neste caso o polimorfismo
{
b.oque();
}
try {
funcao6();
}
catch (baseErro & b) //convem passar por referencia para existir o polimorfismo
//porque é passado por referencia, surgre assim o erro da derivada
//e para que não se faça mais uma copia da excepção que foi lançada
{
b.oque();
}
return 0;
}
………..varios, exame1920_epocanormal (a25)
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>
using namespace std;
class Bilhete
{
string passageiro;
int passaporte;
string & companhia; //obrigatoria ser na lista de inicialização, se for & e const
vector<int> id_malas;
//Acrescentar bagagens ao bilhete (representadas pelos seus ID e sem repetir):
int pesquisa(int id)const;
public:
//ou 1
//Bilhete(string passageiro0, int passaporte0, string & companhia0, vector<int> id_malas0);
//ou 2
Bilhete(string passageiro0, int passaporte0, string& companhia0, initializer_list<int> id_malas0);
//lidar com a atribuir objectos b1=b2
Bilhete& operator=(const Bilhete& ob);
//Acrescentar bagagens ao bilhete (representadas pelos seus ID e sem repetir):
//operador que pode ser membro
Bilhete& operator <<(int id); //por estar em cadeia
//ou
//void operator <<(int id); //se não estivesse em cadeia
//Remover todas as bagagens com id superior a um indicado):
Bilhete& operator -=(int id); //por estar em cadeia
//extra
string getAsAstring()const;
};
//Mostrar o conteúdo no ecrã da forma (bilhete1 e bilhete2 são objetos da classe Bilhete):
ostream& operator<<(ostream& saida, const Bilhete & ob);
//Acrescentar bagagens ao bilhete (representadas pelos seus ID e sem repetir):
int Bilhete::pesquisa(int id) const
{
for(unsigned int i = 0; i< id_malas.size(); i++)
{
if(id == id_malas[i])
{
return i;
}
}
return -1;
}
//Acrescentar bagagens ao bilhete (representadas pelos seus ID e sem repetir):
Bilhete& Bilhete::operator<<(int id)
{
int pos = pesquisa(id);
if(pos == -1)
{
//não está lá o id
id_malas.push_back(id);
}
//senão não faço nada
return *this; // pedido em cadeia, o retorno é *this
}
//Remover todas as bagagens com id superior a um indicado):
Bilhete& Bilhete::operator-=(int id)
{
for(auto it= id_malas.begin(); it != id_malas.end(); )
{
if(*it >id)
{
it = id_malas.erase(it);
}else
{
++it;
}
}
return *this;
}
//ou
//void Bilhete::operator<<(int id) //se não estivesse em cadeia
//ou 1
//Bilhete::Bilhete(string passageiro0, int passaporte0, string& companhia0, vector<int> id_malas0) : passageiro(passageiro),
//passaporte(passaporte),
//companhia(companhia),
//id_malas(id_malas)
//{
//}
//ou 2, versão "mais complicada"
Bilhete::Bilhete(string passageiro0, int passaporte0, string& companhia0, initializer_list<int> id_malas0) : passageiro(passageiro0),
passaporte(passaporte0),
companhia(companhia0)
{
//para lidar com o initializer_list
for(auto & m : id_malas0)
{
id_malas.push_back(m);
}
}
//lidar com a atribuir objectos
Bilhete& Bilhete::operator=(const Bilhete& ob)
{
//evitar autoatribuição
if(this == &ob)
{
return *this;
}
//pode-se atribuir tudo menos a companhia, i.e. referencias e const
passageiro = ob.passageiro;
passaporte = ob.passaporte;
id_malas = ob.id_malas;
return *this;
}
//extra
string Bilhete::getAsAstring() const
{
ostringstream oss;
oss << "Passageiro: " << passageiro << " Passaporte: " << passaporte << " Companinha: " << companhia << "mala:" << endl;
for (int i : id_malas)
{
oss << " " << i;
}
oss << endl;
return oss.str();
}
//Mostrar o conteúdo no ecrã da forma (bilhete1 e bilhete2 são objetos da classe Bilhete):
ostream& operator<<(ostream& saida, const Bilhete& ob)
{
saida << ob.getAsAstring();
return saida;
}
int main()
{
//alinea 6.
//string & companhia; exige uma variavel
string aux_nome("tap");
//ou 1 ou 2
Bilhete b1("nome Passageiro", 123, aux_nome, {1,2,3,4}); //{1,2,3,4} com initializer_list
cout <<b1.getAsAstring();
//para atribuir objectos
string aux_nome2("fly");
Bilhete b2("outro Passageiro",456, aux_nome2, {5,6,7,8});
cout << b2.getAsAstring();
//atribuir objectos b1 = b2
//não é possivel por existe objectos com membros objectos com referencia (&) ou const
//assim b1=b2 dá erro, é a atribuição default
//solução: operador atribuição e operator
b1 = b2;
cout << b1.getAsAstring();
//Mostrar o conteúdo no ecrã da forma (bilhete1 e bilhete2 são objetos da classe Bilhete):
cout << "\nPassageiro 1 : " << b1 << "\nPassageiro 2" << b2;
//Acrescentar bagagens ao bilhete (representadas pelos seus ID e sem repetir):
b1 << 123 << 789 << 123;
cout << "\nPassageiro 1 acrescentou: " << b1;
//Remover todas as bagagens com id superior a um indicado):
(b1 -= 40) -= 35;
cout << "\nPassageiro 1 removeu: " << b1;
cout << "\nfim do main" << endl;
return 0;
}
………..varios, exame1920_epocanormal (a25)
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>
using namespace std;
//antes
/*
class Doutor {
string nome;
public:
Doutor(const string& n) :nome(n) {}
string getNome()const { return nome; }
};
class Engenheiro {
string nome;
public:
Engenheiro(const string& n) :nome(n) {}
string getNome()const { return nome; }
};
class Empresa {
vector<Doutor> doutores;
vector<Engenheiro> engenheiros;
public:
Empresa() {
doutores.push_back(Doutor("D1"));
doutores.push_back(Doutor("D2"));
engenheiros.push_back(Engenheiro("E1"));
engenheiros.push_back(Engenheiro("E2"));
}
void cumprimentar() {
for (auto& d : doutores) {
cout << "Bom dia Doutor " << d.getNome() << endl;
}
for (auto& e : engenheiros) {
cout << "Bom dia Engenheiro " << e.getNome() << endl;
}
}
void removeDoutor(string nome) {
// remove o doutor com esse nome do seu vector
}
void removeEngenheiro(string nome) {
// remove o engenheiro com esse nome do seu vector
}
};
*/
//depois corrigido
//class abstracta
class Funcionario
{
string nome;
public:
Funcionario(string nome0) :nome(nome0){}
virtual void cumprimentar() const = 0;
string getNome()const
{
return nome;
}
//para funionar o destutor, construtor por copia e operador atribuição
virtual Funcionario* duplica()const = 0;
};
class Doutor: public Funcionario
{
public:
Doutor(const string& nome0)
: Funcionario(nome0)
{
}
void cumprimentar() const override
{
cout << "Bom dia Doutor " << getNome() << endl;
}
Funcionario* duplica() const override
{
return new Doutor(*this);
}
};
class Engenheiro : public Funcionario
{
public:
Engenheiro(const string& nome0)
: Funcionario(nome0)
{
}
void cumprimentar() const override
{
cout << "Bom dia Engenheiro " << getNome() << endl;
}
Funcionario* duplica() const override
{
return new Engenheiro(*this);
}
};
class Empresa {
vector<Funcionario*> funcionarios;
int pesquisa(string nome) const
{
for (unsigned int i = 0; i < funcionarios.size(); i++)
{
if (nome == funcionarios[i]->getNome())
{
return i;
}
}
return -1;
}
public:
Empresa() {
funcionarios.push_back(new Doutor("D1"));
funcionarios.push_back(new Doutor("D2"));
funcionarios.push_back(new Engenheiro("E1"));
funcionarios.push_back(new Engenheiro("E2"));
}
void cumprimentar() {
for (auto& d : funcionarios) {
d->cumprimentar();
}
}
void removerNome(string nome0)
{
int pos = pesquisa(nome0);
if(pos == -1)
{
return;
}
//existe posso exclucivsa, eliminar o objecto de mem dinamica
delete funcionarios[pos];
//remover o ponteiro
funcionarios.erase(funcionarios.begin() + pos);
}
//e existe propriedade exclusiva da empresa
//fazer destrutor, construtor por copia e operador atribuição e duplica (esta em funcionarions)
~Empresa()
{
for(auto f: funcionarios)
{
delete f;
}
}
//construtor por copia
Empresa(const Empresa& ob)
{
*this = ob; //apenas, porque não existem ponteiros primitivos
}
//operador atribuição
Empresa &operator=(const Empresa &ob)
{
if(this ==&ob)
{
return *this;
}
for(auto f: funcionarios)
{
delete f;
}
funcionarios.clear();
for(auto f: ob.funcionarios)
{
//depois de feitos os duplicas
funcionarios.push_back(f->duplica());
}
return *this;
}
};
int main() {
Empresa empresa;
empresa.cumprimentar();
Empresa empresa2 = empresa;
empresa2.removerNome("E1");
empresa2.removerNome("D2");
empresa2.cumprimentar();
cout << "\nfim do main" << endl;
return 1;
}
Tags : apontamentos, c++11, Learn C plus plus, poo_lab_pt7, poof
0 thoughts on “excepções e vários”