Tag: t1920r
Questões de C++ (parte3)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//----------------------------------pergunta 1
//construir o construtor por cópia
class Funcionario{ /* ... */ };
class Reuniao
{
//só faz uso das fichas funcionarios, convocados
vector <Funcionario*> convocados;
//é da posse exclusiva da Reuniao, ordemDeTrabalhos
vector <string*> ordemDeTrabalhos;
public:
//..
~Reuniao()
{
for(string * s: ordemDeTrabalhos)
{
delete s;
}
}
//do construtor por cópia
Reuniao(const Reuniao & ob)
{
convocados = ob.convocados; //copiar vector Funcionario
//porque é posse exclusiva, podes querer modificar
for(string * o : ordemDeTrabalhos) //copiar as strings
{
ordemDeTrabalhos.push_back(new string(*o));
}
}
};
int main()
{
}
//regra dos três:
//destrutor
//construtor por cópia
//operador de cópia
//https://pt.wikipedia.org/wiki/Regra_dos_tr%C3%AAs_(C%2B%2B)#Regra_dos_Tr%C3%AAs
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//----------------------------------pergunta 2
class Num
{
int n;
public:
Num()
{
n = 0;
}
void setN(int nn)
{
n = nn;
}
int getN()const
{
return n;
}
};
void f(const Num * p)
{
p->setN(5); //<- erro
//é const o Num
//logo não são do mesmo tipo
p = new Num();
}
void g(Num * const p)
{
p->setN(5);
p = new Num(); //<- erro
//é const o p
//logo não pode ser modificado
}
int main()
{
Num ob;
ob.setN(4);
f(&ob);
g(&ob);
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//----------------------------------pergunta 3
class Erro {
string msg;
public:
Erro(const string & s = "") :msg(s)
{
}
string what()
{
return msg;
}
};
void calculaArea(int lado)
{
try
{
if(lado < 0)
{
throw Erro("lado negativo");
}else if(lado >10)
{
throw new string("lado superior ao limite");
}
}catch(Erro & e)
{
lado = 0;
}catch(string & e)
{
lado = 10;
}
cout << "area = " << lado * lado << ";";
}
int main()
{
try
{
calculaArea(-2);
cout << "depois; ";
}catch (Erro & e)
{
cout << "catch main; \n";
}catch(string & e)
{
cout << "catch main; \n";
}
cout << "fim main;\n";
}
ouput:
area = 0
depois;
fim main
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//----------------------------------pergunta 4
class Canideo
{
int peso;
string dieta;
public:
Canideo(int a, string b = "Carne"): peso(a), dieta(b)
{
}
Canideo() = default;
virtual ~Canideo()
{
};
virtual double dose() const
{
return peso * 0.1;
};
int getPeso() const
{
return peso;
}
string getDieta() const
{
return dieta;
}
};
class Cao: public Canideo
{
string nome;
public:
Cao(int a, string b = "Racao", string c = "Bobi") : Canideo(a,b), nome(c)
{
}
virtual double dose() const override
{
return getPeso() * 0.05;
}
};
class Lobo: public Canideo
{
string habitat;
public:
Lobo(int a, string b = "galinha", string c = "floresta") : Canideo(a), habitat(c)
{
}
};
int main()
{
Lobo a(120);
Canideo* c = new Cao(20);
cout << a.getDieta() << " " << c->getDieta() << " ";
cout << a.dose() << c->dose() << endl;
}
output
carne racao 12 1
//A especificação = default após a declaração do construtor por omissão,
//indica ao compilador para disponibilizar o construtor por omissão, trivial
//O construtor por omissão, trivial faz as seguintes ações:
//É aplicada a inicialização dos membros variáveis, feita na declaração
//Relativamente aos restantes membros variáveis:
//Os membros variáveis de tipo primitivo não são inicializados
//Os membros que são objetos de classes são inicializados pelos seus
//construtores por omissão
//Se a classe for derivada de uma classe base, o subobjeto da classe base
//é inicializado pelo construtor por omissão desta classe base
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//----------------------------------pergunta 5
//acrescentar um novo tipo de cao, o Galgo
//que tem um determinada velocidade, indicada na criação deste objecto
//a velocidade tem impacto na sua dose diaria
//qual a solução?
//a) criar uma classe derivada de Canideo com atributo velocidade. esta classe deve
//ter um construtor e tem que redefinir o método virtual dose()
//b) criar uma classe derivada de Cao com atributo velocidade. esta classe
//deve ter um construtor e tem que redefinir o método virtual dose();
//c) criar uma classe derivada de Cao com atributo velocidade. esta classe
//deve ter um construtor, mas pode utilizar o método virtual dose() da classe
//base
//d) acrescentar um atributo booleano tipo à classe Cão, indicando se os
//objectos são Galgos. adpatar o método dose() desta classe, para calcular
//a dose diária correta se os cães em questão forem galgos.
class Canideo
{
int peso;
string dieta;
public:
Canideo(int a, string b = "Carne"): peso(a), dieta(b)
{
}
Canideo() = default;
virtual ~Canideo()
{
};
virtual double dose() const
{
return peso * 0.1;
};
int getPeso() const
{
return peso;
}
string getDieta() const
{
return dieta;
}
};
class Cao: public Canideo
{
string nome;
public:
Cao(int a, string b = "Racao", string c = "Bobi") : Canideo(a,b), nome(c)
{
}
virtual double dose() const override
{
return getPeso() * 0.05;
}
};
class Galgo : public Cao
{
int velocidade;
public:
Galgo(int a, int v, string b = "Racao") : Cao(a,b), velocidade(v)
{
}
virtual double dose() const override
{
return getPeso() * 0.05 / velocidade;
}
};
resposta:
b) criar uma classe derivada de Cao com atributo velocidade.esta classe
deve ter um construtor e tem que redefinir o método virtual dose();
//porque é um tipo Cao, e a velocidade afecta paenas o tipo Galgo
Tags : c++11, Learn C plus plus, POO, t1920r