Guest User

Untitled

a guest
Jan 23rd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.60 KB | None | 0 0
  1. /*NOMBRE: Álvaro García León
  2.   GRUPO: A2
  3.   NOMBRE DEL FICHERO: Subasta6.cpp
  4.   DESCRIPCIÓN: Archivo "cliente" implementado mediante objetos.
  5. */
  6.  
  7. #include <iostream>
  8. #include <cstdlib>
  9. #include "Articulo.h"
  10. #include "ArticuloInmediato.h"
  11.  
  12. using namespace std;
  13.  
  14. void gestiona(Articulo arti);
  15. void pgestiona(Articulo *arti);
  16.  
  17. //PROGRAMA PRINCIPAL
  18. int main()
  19. {
  20.    
  21.     //EJERCICIO-1-----------------------------------------------------------------------------------------------------------------
  22.    
  23.     //ArticuloInmediato unArticulo1("Producto a subastar",100,1200);
  24.     //Articulo unArticulo2= ArticuloInmediato("Producto a subastar",100,1000);
  25.    
  26.    
  27.     //unArticulo1.muestra();//El objeto actúa como la clase ArticuloInmediato,mostrando su precio inmediato.
  28.     //unArticulo2.muestra();
  29.     /*Al crear el objeto, este adopta los métodos de la clase en la que está declarada, debido al enlazado temprano de Dev-Cpp,
  30.     de este modo, se muestra el primer objeto como la clase ArticuloInmediato y el segundo como Artículo.*/
  31.    
  32.     /*unArticulo1=unArticulo2;*/
  33.     /* C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp In function `int main()':
  34.        31 C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp no match for 'operator=' in 'unArticulo1 = unArticulo2'  
  35.        note C:\Users\Alvaro\Desktop\Practica 3\ArticuloInmediato.h:6 candidates are: ArticuloInmediato& ArticuloInmediato::operator=(const ArticuloInmediato&)
  36.        C:\Users\Alvaro\Desktop\Practica 3\Makefile.win [Build Error]  [Subasta6.o] Error 1  
  37.    
  38.     Esto se debe a que no podemos asignar un objeto de tipo Articulo a uno de tipo ArticuloInmediato, pues el primero es heredado del segundo
  39.     y sería como restringir la clase madre.
  40.     */
  41.    
  42.     //unArticulo2=unArticulo1;//Efectivamente, se comporta como Articulo.
  43.    
  44.     //unArticulo1.getPrecioInmediato();//unArticulo1.getPrecioInmediato(); La revisión no muestra ningún fallo aquí.
  45.     //unArticulo2.getPrecioInmediato();
  46.     /*La revisión muestra el siguiente fallo:
  47.       C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp In function `int main()':
  48.       52 C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp 'class Articulo' has no member named 'getPrecioInmediato'
  49.       C:\Users\Alvaro\Desktop\Practica 3\Makefile.win [Build Error]  [Subasta6.o] Error 1
  50.       Este error es debido a que al estar declarado como Articulo, no puede emplear métodos de la clase hija.(ArticuloInmediato)
  51.     */
  52.    
  53.     //EJERCICIO-2-----------------------------------------------------------------------------------------------------------------
  54.    
  55.     //ArticuloInmediato * punArticulo1= new ArticuloInmediato("Producto a subastar",100,1200);
  56.     //Articulo * punArticulo2= new ArticuloInmediato("Producto a subastar",100,1000);
  57.     //No se produce ningún error en estas dos instrucciones al igual que antes, porque la primera se declara del mismo tipo
  58.     //que el objeto es construido y la segunda porque la clase madre puede contener un objeto de la clase hija.
  59.    
  60.     //unArticulo3=unArticulo4;
  61.     /*  C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp In function `int main()':
  62.         50 C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp invalid conversion from `Articulo*' to `ArticuloInmediato*'
  63.         C:\Users\Alvaro\Desktop\Practica 3\Makefile.win [Build Error]  [Subasta6.o] Error 1
  64.     La conversión del puntero de la clase madre a la hija no es posible, sin embargo la inversa si lo es.
  65.     */
  66.     //unArticulo4=unArticulo3;
  67.     //No se produce error dado que es el mismo caso que antes de usar punteros.
  68.    
  69.     //punArticulo1->muestra();
  70.     //punArticulo2->muestra();
  71.     //Mismo resultado durante la ejecución.
  72.    
  73.     //punArticulo1=punArticulo2; //Se produce el mismo error al intentar asignar a la clase hija, la clase madre.
  74.     //punArticulo2=punArticulo1; //Tampoco produce error.
  75.                                
  76.     //unArticulo3->getPrecioInmediato(); Igualmente con punteros, la sintaxis es correcta.
  77.     //unArticulo4->getPrecioInmediato();
  78.     /*La revisión muestra el siguiente fallo:
  79.       C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp In function `int main()':
  80.       52 C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp 'class Articulo' has no member named 'getPrecioInmediato'
  81.       C:\Users\Alvaro\Desktop\Practica 3\Makefile.win [Build Error]  [Subasta6.o] Error 1
  82.       Vemos también en este caso que la clase madre no puede acceder a los métodos de la clase hija.
  83.     */    
  84.      
  85.       //EJERCICIO-3--------------------------------------------------------------------------------------------------------------
  86.      
  87.       /*Para conseguir polimorfismo, editamos el fichero Articulo.h poniendo el calificador virtual ante los
  88.         dos métodos que son redefinidos en ArticuloInmediato. Una vez hecho esto me dispongo a comprobar
  89.         que efectivamente el objeto punArticulo2 se ha de comportar como la clase con la que se ha construido.
  90.       */
  91.      
  92.       //punArticulo2->muestra();
  93.      
  94.       //EJERCICIO-4--------------------------------------------------------------------------------------------------------------
  95.      
  96.       //unArticulo2.muestra();
  97.       /*Efectivamente volvemos a obtener el error: "undefined reference to `vtable for Articulo`" el cual nos indica
  98.       que el virtual necesita punteros para su funcionamiento. Es por eso que no hay poliformismo.*/
  99.      
  100.       //EJERCICIO-5---------------------------------------------------------------------------------------------------------------
  101.      
  102.       //ArticuloInmediato unArticulo1("Producto a subastar",100,1200);
  103.       //gestiona(unArticulo1);
  104.       //Efectivamente, la accion "gestiona" trata al parámetro como si fuese de la clase Articulo a pesar de su declaración y
  105.       //construcción como ArticuloInmediato.
  106.      
  107.       //EJERCICIO-6--------------------------------------------------------------------------------------------------------------
  108.      
  109.       //ArticuloInmediato * punArticulo1= new ArticuloInmediato("Producto a subastar",100,1200);
  110.       //gestiona(*punArticulo1);
  111.       //Al igual que con objetos, sigue sin haber polimorfismo.
  112.      
  113.       //EJERCICIO-7--------------------------------------------------------------------------------------------------------------
  114.      
  115.       //ArticuloInmediato * punArticulo1= new ArticuloInmediato("Producto a subastar",100,1200);
  116.       //Articulo * punArticulo2= new Articulo("Producto a subastar",100);
  117.       //Tanto pgestiona(punArticulo1); como pgestiona(punArticulo2); actúan correctamente mostrando el puntero de la clase
  118.       // a la que pertenecen, aunque el procedimiento pida explicitamente un puntero a Articulo.
  119.      
  120.       //EJERCICIO-8---------------------------------------------------------------------------------------------------------------
  121.      
  122.       ArticuloInmediato * punArticulo1= new ArticuloInmediato("Producto a subastar",100,1200);
  123.       Articulo * punArticulo2= new Articulo("Producto a subastar",100);
  124.       punArticulo1->muestra();
  125.       punArticulo2->muestra();
  126.       //He modificaco del fichero ArticuloInmediato.cpp de la siguiente manera:
  127.            /*Incluyendo la redefinición del método getDescripcion.
  128.             char * ArticuloInmediato::getDescripcion()
  129.             {
  130.                   return(strcat("[INM]", Articulo::getDescripcion()));
  131.             }
  132.             Incluyendo el método en el fichero ArticuloInmediato.h:
  133.                        public:
  134.                               char * getDescripcion();
  135.                               ...
  136.                               ...
  137.            */
  138.       //En un principio no nos ha funcionado precisamente debido a que se nos ha olvidado incluir el modificador "virtual"
  139.       //antes del método correspondiente en el fichero "ArticuloInmediato.h" .
  140.      
  141.       //EJERCICIO-9---------------------------------------------------------------------------------------------------------------  
  142.      
  143.      
  144.      
  145.      
  146.      
  147.      
  148.      
  149.   system("PAUSE");
  150.   return 0;    
  151. }
  152.  
  153. void gestiona(Articulo arti)
  154. {
  155.      //Variables
  156.      int opcion,precio;
  157.      //Principio
  158.      while(opcion!=3)
  159.      {
  160.                      cout<<"Desea pujar, mostrar o salir: "<<endl;
  161.                      cout<<"\t 1.Pujar"<<endl;
  162.                      cout<<"\t 2.Mostrar"<<endl;
  163.                      cout<<"\t 3.Salir"<<endl;
  164.                      cin>>opcion;
  165.                      
  166.                      if(opcion==1)
  167.                      {
  168.                                   cout<<"Introduce el precio de la puja: "<<endl;
  169.                                   cin>>precio;
  170.                                   arti.puja(precio);
  171.                      }
  172.                      if(opcion==2)
  173.                      {
  174.                                   arti.muestra();
  175.                      }
  176.      }
  177. }
  178.  
  179. void pgestiona(Articulo *arti)
  180. {
  181.      //Variables
  182.      int opcion,precio;
  183.      //Principio
  184.      while(opcion!=3)
  185.      {
  186.                      cout<<"Desea pujar, mostrar o salir: "<<endl;
  187.                      cout<<"\t 1.Pujar"<<endl;
  188.                      cout<<"\t 2.Mostrar"<<endl;
  189.                      cout<<"\t 3.Salir"<<endl;
  190.                      cin>>opcion;
  191.                      
  192.                      if(opcion==1)
  193.                      {
  194.                                   cout<<"Introduce el precio de la puja: "<<endl;
  195.                                   cin>>precio;
  196.                                   arti->puja(precio);
  197.                      }
  198.                      if(opcion==2)
  199.                      {
  200.                                   arti->muestra();
  201.                      }
  202.      }
  203. }
Add Comment
Please, Sign In to add comment