Consulta sobre herencia y cómo proceder

Iniciado por Cero++, 24 Diciembre 2018, 17:03 PM

0 Miembros y 1 Visitante están viendo este tema.

Cero++

Buenas, miren en este ejercicio me pide que cree 3 clases, una llamada Tecla, otra llamada Pedal y otra llamada Instrumento (No tengo idea para que sirve esta). Bueno el tema es este, hice el código siguiendo los pasos que me detallaba el ejercicio, pero el tema es que no encuentro manera de hacerlo ya en el main, tengo una manera de hacerlo, pero no estaría siguiendo al pie de la letra el ejercicio, así que, a ver si me pueden orientar un poco por favor.

Consigna:
Código (cpp) [Seleccionar]
a. Defina una clase Tecla para representar una tecla de un piano. Cada tecla
puede estar o no apretada, y tiene ademas una nota asociada (cuyo nombre se
representará con un string). Su interfaz debe tener tener entonces:
- un constructor que reciba el nombre de la nota
- un método VerNota que retorne el nombre de la nota
- un método Apretar que cambie el estado de la tecla a apretada.
- un método Soltar que cambie el estado de la tecla a no apretada.
- un método EstaApretada que retorne true si la tecla está apretada, false en caso
contrario
b. Defina una clase Pedal para representar el pedal de un piano. El pedal debe
almacenar un valor (f loat ) que indica la presion que el musico ejerce sobre el pedal.
El constructor debe inicializar la presion en 0 , y la clase debe tener metodos para
modificarla y consultarla.
c. Reutilizando las clases Tecla , Pedal e Instrumento :
class Instrumento{
virtual string VerTipo() { return "sin_nombre"; }
};
defina una clase Piano que modele un instrumento de tipo "piano" con solo 7 teclas
(" do", "re", "mi", "fa", "sol", "la" y "si" ) y 1 pedal. La clase piano debe tener métodos
para:
- apretar una tecla, indicando el numero de tecla, y que retorne la nota que debería
sonar.
- soltar una tecla, indicando el numero de tecla
- presionar el pedal, indicando la presion que se aplica


Código que hice:
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
class Tecla{
string nota; int tecla;
public:
Tecla(string _t){
nota=_t;
}
string Ver_nota(){
return nota;
}
void Apretar(){
tecla=1;
}
void Soltar(){
tecla=0;
}
bool Esta_apretada(){
if(tecla!=0){
return true;
}
return false;
}

};
class Pedal{
float presion;
public:
Pedal(){
presion=0;
}
void Aumentar_presion(float _x){
presion=_x;
}
void Disminuir_presion(float _x){
presion=_x;
}
float Ver_presion(){
return presion;
}
};

class Ver_Tipo{
public:
virtual string Ver_tipo(){
return "sin nombre";
}
};

class Piano{
Tecla *T[7]; Pedal P;
public:
string Apretar_una_tecla(int _nro){
T[_nro]->Apretar();
return T[_nro]->Ver_nota();
}
void Soltar_una_tecla(int _nro){
T[_nro]->Soltar();
}
void Presionar(float _f){
P.Aumentar_presion(_f);
}

};
int main(int argc, char *argv[]) {
Tecla *T[7]; //No se como proseguir...
T[0]=new Tecla ("Do");
T[1]=new Tecla ("Re");
T[2]=new Tecla ("Mi");
T[3]=new Tecla ("Fa");
T[4]=new Tecla ("Sol");
T[5]=new Tecla ("La");
T[6]=new Tecla ("Si");
return 0;
}


Volví a releer la teoría, para ver si podía entenderlo mejor, pero no le encuentro la vuelta sinceramente
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

MAFUS

La clase instrumento es la que tu has nombrado cómo Piano.

Dentro de main debes crear un objeto piano a partir de instrumento y debe guardar las siete teclas y un pueda. La forma de acceder a teclas y pedal será a partir de piano.

CalgaryCorpus

#2
Te falta la clase Instrumento.
La clase piano deriva de instrumento
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cero++

#3
Hice esto, no sé si cumple con lo que pide el ejercicio, a ver si me dan el visto bueno.

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
class Instrumento{
public:
virtual string Ver_tipo(){
return "Sin tipo";
};
};
class Tecla{
int tecla; string nota;
public:
Tecla (){

}
Tecla(string _nom){
nota=_nom;
}
string Ver_nota(){
return nota;
}
void Apretar(){
tecla=1;
}
void Soltar(){
tecla=0;
}
bool Esta_apretada(){
if(tecla==1){
return true;
}
return false;
}

};
class Pedal{
float presion;
public:
Presion(float _p=0){
presion=_p;
}
void Aumentar_presion(float _f){
presion=_f;
}
void Disminuir_presion(float _f){
presion=_f;
}
float Ver_presion(){
return presion;
}
};
class Piano:public Tecla, public Pedal, public Instrumento{
Tecla *T[7]; Pedal P;
public:
void Cargar_nota(){
T[0]=new Tecla ("Do");
T[1]=new Tecla ("Re");
T[2]=new Tecla ("Mi");
T[3]=new Tecla ("Fa");
T[4]=new Tecla ("Sol");
T[5]=new Tecla ("La");
T[6]=new Tecla ("Si");
}
string Apretar_tecla(int _i){
return T[_i]->Ver_nota();
}
void Soltar_tecla(int _i){
T[_i]->Soltar();
}
void Presionar_pedal(float _f){
P.Aumentar_presion(_f);
}
string Ver_tipo (){
return "Piano";
}
};
int main(int argc, char *argv[]) {
Piano P;
P.Cargar_nota();
cout<<"Estas son las notas de cada tecla [1-7]"<<endl;
cout<<endl;
cout<<"Tecla 1: "<<P.Apretar_tecla(0)<<endl;
cout<<"Tecla 2: "<<P.Apretar_tecla(1)<<endl;
cout<<"Tecla 3: "<<P.Apretar_tecla(2)<<endl;
cout<<"Tecla 4: "<<P.Apretar_tecla(3)<<endl;
cout<<"Tecla 5: "<<P.Apretar_tecla(4)<<endl;
cout<<"Tecla 6: "<<P.Apretar_tecla(5)<<endl;
cout<<"Tecla 7: "<<P.Apretar_tecla(6)<<endl;
cout<<endl<<endl;
int i;
cout<<"¿Que tecla desea presionar? [1-7]"; cin>>i;
cout<<"Mostrando la nota que contiene la tecla nro "<<i<<": "<<P.Apretar_tecla(i+1)<<endl;
cout<<"Su instrumento es de tipo : "<<P.Ver_tipo();
return 0;
}
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

CalgaryCorpus

El Piano es un tipo de Instrumento, no es un tipo de tecla y no es un tipo de pedal. No tiene sentido que haya derivación de teclas o.pedales.

En vez de definir el método cargar define y usa el constructor.

Si le pides al usuario el índice de las teclas que van de 1 a 7, por qué le sumas 1?

El método apretar del piano no ejecuta el método apretar de la tecla.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cero++

Cita de: CalgaryCorpus en 25 Diciembre 2018, 05:46 AM
El Piano es un tipo de Instrumento, no es un tipo de tecla y no es un tipo de pedal. No tiene sentido que haya derivación de teclas o.pedales.

En vez de definir el método cargar define y usa el constructor.

Si le pides al usuario el índice de las teclas que van de 1 a 7, por qué le sumas 1?

El método apretar del piano no ejecuta el método apretar de la tecla.

Con respecto al piano, entonces declaro un puntero a Instrumento que apunte a un piano y desde el puntero Instrumento manejo todo? Ya lo probé así y no me deja acceder a los métodos de piano, ya que Instrumento solo tiene el método "Ver_tipo", no te estoy entendiendo.

Si defino el constructor en Piano, ya el programa no me funciona, por eso declaré el método "Cargar", que sí me dejaba ver las teclas ya pre cargadas sin la necesidad de hacer que el usuario ingrese las notas.

No me dí cuenta, tenes razón con lo de sumarle 1 al valor que ingresa el usuario, en realidad tengo que restarle 1 para mostrar la posición correcta, my bad.

Ya acomodé el método apretar de Piano para que apriete la tecla  ;D

Con las otras dudas, me podrías ayudar? Ya que sigo sin entenderte, probé hacer lo que dijiste y eso fueron los resultados que obtuve, lo que te comenté más arriba.

Gracias por la ayuda  ;D
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

CalgaryCorpus

Aprende cómo se hace que una clase derive de otra y haz que Piano derive de Instrumento.
Aqui mi perfil en LinkedIn, invitame un cafe aqui