Problema
Considere o conceito de brinquedo, contendo as propriedades cor e peso. Considere ainda as especializações deste conceito: pião e corda de saltar. Os conceitos pião e corda têm, respectivamente, a velocidade de rotação e o comprimento como propriedades adicionais. Considere que todos os brinquedos podem ser descritos (função describe), mas que apenas os piões giram (spin) e que apenas cordas oscilam (hop). Implemente em C++ as classes que representam estes conceitos: cada método dos anteriores deve ser implementado simplesmente com uma instrução que apresente uma cadeia de caracteres descritiva da acção. Implemente ainda os operadores de comparação (operator==) e de envio para um canal de saída (operator<<). Os brinquedos genéricos podem ser inicializados especificando-se apenas o peso (neste caso, a cor é branca), mas podem ser também inicializados especificando-se ambas as propriedades (a acção para o peso é idêntica à anterior). Os piões e as cordas são sempre inicializados com explicitação das suas respectivas propriedades, i.e., cor, peso e velocidade de rotação ou comprimento
(conforme o caso). Construa uma aplicação ("main") que ilustre a utilização das classes.
Solução
As directivas #include foram omitidas.
classe Brinquedo
|
class Brinquedo {
protected:
std::string cor;
float peso;
public:
Brinquedo(float peso) : cor("branco"), peso(peso) {}
Brinquedo(std::string cor, float peso) : cor(cor), peso(peso) {}
virtual void describe() const {
std::cout << "Brinquedo de cor " << cor << " e peso " << peso << " gramas" << std::endl;
}
bool operator==(const Brinquedo& other) const {
return cor == other.cor && peso == other.peso;
}
friend std::ostream& operator<<(std::ostream& os, const Brinquedo& brinquedo) {
os << "Brinquedo de cor " << brinquedo.cor << " e peso " << brinquedo.peso << " gramas";
return os;
}
};
|
classe Pião
|
class Piao : public Brinquedo {
float velocidade_rotacao;
public:
Piao(std::string cor, float peso, float velocidade_rotacao)
: Brinquedo(cor, peso), velocidade_rotacao(velocidade_rotacao) {}
void describe() const override {
std::cout << "Pião de cor " << cor << ", peso " << peso << " gramas e velocidade de rotação " << velocidade_rotacao << " RPM" << std::endl;
}
void spin() const {
std::cout << "O pião está a girar a " << velocidade_rotacao << " RPM" << std::endl;
}
bool operator==(const Piao& other) const {
return Brinquedo::operator==(other) && velocidade_rotacao == other.velocidade_rotacao;
}
friend std::ostream& operator<<(std::ostream& os, const Piao& piao) {
os << "Pião de cor " << piao.cor << ", peso " << piao.peso << " gramas e velocidade de rotação " << piao.velocidade_rotacao << " RPM";
return os;
}
};
|
classe Corda
|
class Corda : public Brinquedo {
float comprimento;
public:
Corda(std::string cor, float peso, float comprimento)
: Brinquedo(cor, peso), comprimento(comprimento) {}
void describe() const override {
std::cout << "Corda de saltar de cor " << cor << ", peso " << peso << " gramas e comprimento " << comprimento << " metros" << std::endl;
}
void hop() const {
std::cout << "A corda está a oscilar com um comprimento de " << comprimento << " metros" << std::endl;
}
bool operator==(const Corda& other) const {
return Brinquedo::operator==(other) && comprimento == other.comprimento;
}
friend std::ostream& operator<<(std::ostream& os, const Corda& corda) {
os << "Corda de saltar de cor " << corda.cor << ", peso " << corda.peso << " gramas e comprimento " << corda.comprimento << " metros";
return os;
}
};
|
Exemplo de função principal (outras seriam admissíveis).
Função principal (main)
|
int main() {
Brinquedo brinquedo_generico(50);
Brinquedo brinquedo_generico2("azul", 100);
brinquedo_generico.describe();
brinquedo_generico2.describe();
Piao piao("vermelho", 200, 5000);
piao.describe();
piao.spin();
Corda corda("verde", 300, 2.5);
corda.describe();
corda.hop();
if (brinquedo_generico == brinquedo_generico2) {
std::cout << "Os brinquedos genéricos são iguais" << std::endl;
} else {
std::cout << "Os brinquedos genéricos são diferentes" << std::endl;
}
std::cout << brinquedo_generico << std::endl;
std::cout << piao << std::endl;
std::cout << corda << std::endl;
return 0;
}
|