elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: 1 [2] 3 4 5 6 7 8 9
11  Programación / Programación C/C++ / Tengo una duda sobre redefinición de funciones virtuales en C++ en: 20 Febrero 2015, 17:01 pm
Hola :) , estoy intentando hacer el juego de pacman en modo consola en mis ratos de ocio y de pasada me voy recordando algunas cosas que ya me estaba olvidando y afianzando otros conceptos sobre la programación orientada a objetos.

Expondré lo que hice hasta ahora y luego mi duda. No es tanto sobre el código sino más que todo en cuanto a cómo funciona lo de la redefinición de una función virtual.

Resulta que tengo tres clases: PERSONAJE, PACMAN, FANTASMA:

Clase Personaje:
Código
  1. class PERSONAJE {
  2.   private:
  3.      int x, y;   // Coordenadas
  4.      int simbolo;
  5.  
  6.   public:
  7.      PERSONAJE(int = 1, int = 1, int = 1);
  8.      void setX(int);
  9.      void setY(int);
  10.      void setSimbolo(int);
  11.      int getX();
  12.      int getY();
  13.      int getSimbolo();
  14.      virtual void mover(int);
  15.      void pintar();
  16.      void borrar();
  17. };
  18.  
  19. /*
  20. void PERSONAJE::PERSONAJE(int x, int y, char simbolo) {
  21.    this->setX(x);
  22.    this->setY(y);
  23.    this->setSimbolo(simbolo);
  24. }
  25. */
  26.  
  27. PERSONAJE::PERSONAJE(int _x, int _y, int _simbolo) : x(_x), y(_y), simbolo(_simbolo) {
  28.   this->pintar();
  29. }
  30.  
  31. void PERSONAJE::setX(int x) {
  32.   this->x = (x > 0 ? x : 1);
  33.   // x = (x > 0 ? x : 1); // Cuidado con este error logico, alli no estaria modificando al atributo
  34. }
  35.  
  36. void PERSONAJE::setY(int y) {
  37.   this->y = (y > 0 ? y : 1);
  38. }
  39.  
  40. void PERSONAJE::setSimbolo(int simbolo) {
  41.   this->simbolo = simbolo;
  42. }
  43.  
  44. int PERSONAJE::getX() {
  45.   return this->x;
  46. }
  47.  
  48. int PERSONAJE::getY() {
  49.   return this->y;
  50. }
  51.  
  52. int PERSONAJE::getSimbolo() {
  53.   return this->simbolo;
  54. }
  55.  
  56. void PERSONAJE::mover(int tecla) {
  57.  
  58.   if (tecla == NADA) {
  59.      return;
  60.   }
  61.   else {
  62.      this->borrar();
  63.  
  64.      if (tecla == IZQUIERDA) {
  65.         if (x > LIMITE_IZQUIERDO + 1) x--;
  66.      }
  67.  
  68.      if (tecla == DERECHA) {
  69.         if (x < LIMITE_DERECHO - 1) x++;
  70.      }
  71.  
  72.      if (tecla == ABAJO) {
  73.         if (y < LIMITE_INFERIOR - 1) y++;
  74.      }
  75.  
  76.      if (tecla == ARRIBA) {
  77.         if (y > LIMITE_SUPERIOR + 1) y--;
  78.      }
  79.  
  80.      this->pintar();
  81.   }
  82. }
  83.  
  84. void PERSONAJE::pintar() {
  85.   gotoxy(x, y);
  86.   cout << (char)getSimbolo();
  87. }
  88.  
  89. void PERSONAJE::borrar() {
  90.   gotoxy(x, y);
  91.   cout << " ";
  92. }
  93.  
  94.  



Clase Pacman:
Código
  1. class PACMAN : public PERSONAJE {
  2.   private:
  3.  
  4.   public:
  5.      PACMAN(int = LIMITE_IZQUIERDO + 1, int = LIMITE_SUPERIOR + 1, int = 1);
  6.      // No redefinimos el metodo pintar() asi que se llamara al de la superclase
  7. };
  8.  
  9. PACMAN::PACMAN(int x, int y, int simbolo) : PERSONAJE(x, y, simbolo) {
  10. }
  11.  



Clase Fantasma:
Código
  1. class FANTASMA : public PERSONAJE {
  2.   private:
  3.  
  4.   public:
  5.      FANTASMA(int = (LIMITE_IZQUIERDO + LIMITE_DERECHO) / 2, int = (LIMITE_SUPERIOR + LIMITE_INFERIOR) / 2, int = 1);
  6.      void mover();
  7. };
  8.  
  9. FANTASMA::FANTASMA(int x, int y, int simbolo) : PERSONAJE(x, y, simbolo) {
  10. }
  11.  
  12. void FANTASMA::mover() {
  13.   int aleatorio = rand() % 4;
  14.  
  15.   this->borrar();
  16.  
  17.   switch (aleatorio) {
  18.      case 0:
  19.         if (getX() > LIMITE_IZQUIERDO + 1) setX(getX() - 1);
  20.         break;
  21.  
  22.      case 1:
  23.         if (getX() < LIMITE_DERECHO - 1) setX(getX() + 1);
  24.         break;
  25.  
  26.      case 2:
  27.         if (getY() < LIMITE_INFERIOR - 1) setY(getY() + 1);
  28.         break;
  29.  
  30.      case 3:
  31.         if (getY() > LIMITE_SUPERIOR + 1) setY(getY() - 1);
  32.         break;
  33.   }
  34.  
  35.   gotoxy(getX(), getY());
  36.   this->pintar(); // Llama al método heredado pintar
  37. }
  38.  

Algunas constantes en mi código:
Código
  1. // Direccion
  2. #define ARRIBA 105
  3. #define ABAJO 107
  4. #define IZQUIERDA 106
  5. #define DERECHA 'l'
  6.  
  7. // Limites
  8. #define LIMITE_SUPERIOR 2
  9. #define LIMITE_INFERIOR 23
  10. #define LIMITE_DERECHO 70
  11. #define LIMITE_IZQUIERDO 20
  12.  
  13. #define NADA 0
  14.  


Mi duda está en lo siguiente:
En mi clase base PERSONAJE defino una función virtual mover(int) la cual tiene un parámetro. Luego, declado dos clases derivadas: PACMAN y FANTASMA.
Dentro de la clase PACMAN (por el momento) no declaro ninguna otra función por lo que concluyo que va a heredar las ya declaradas en la clase base PERSONAJE.
Dentro de la clase FANTASMA estoy declarando una función llamada mover() sin parámetros. Esta función tiene el mismo nombre que la función virtual declarada en la clase base PERSONAJE pero se diferencia en que no tiene ningún parámetro. Entonces ante la duda de si en este caso estoy redefiniendo la función perteneciente al padre, encontré la siguiente información:

Citar
Para redefinir una función virtual en una clase derivada, las declaraciones en la clase base y en la derivada deben coincidir en cuanto a número y tipo de los parámetros. Excepcionalmente pueden diferir en el tipo devuelto.

Entonces según esto, la función mover() perteneciente a la clase hija FANTASMA es diferente a la función mover(int) de la clase padre PERSONAJE (por su parámetro) por lo que podría concluir que no se estaría redefiniendo nada sino que, la clase FANTASMA contaría con dos funciones miembro diferentes:
    - mover()    : Obtenida por la herencia y declarada en el padre PERSONAJE
    - mover(int) : Declarada en la clase hija FANTASMA

Además de las otras funciones heredadas del padre: getX(), getY(), getSimbolo(), setX(int), setY(int), setSimbolo(int), .. , borrar(), pintar().


Siendo todo esto así, creo que no debería tener problemas al realizar llamadas tanto a las funciones mover() y mover(int) desde un objeto de la clase FANTASMA pero cuando realizo dichas llamadas, el compilador me genera un error márcandome esta llamada: f1.mover(IZQUIERDA);:


Código
  1. FANTASMA f1;
  2. f1.mover();
  3. f1.mover(IZQUIERDA);
  4.  




No sé si me estoy haciendo demasiados rodeos  ;D . Espero que me haya dejado entender. Gracias a los que se tomen la molestia de leer y de ayudarme a entender el por qué me sale ese error :D . (Si pudieran también comentar sobre mi código, acepto sugerencias y críticas para poder mejorar. Respecto a la biblioteca conio tengo claro que no es estándar pero en este caso lo que trato más que todo es centrarme en aplicar correctamente los conceptos de la POO)
12  Programación / Programación C/C++ / ¿Al compilar y ejecutar en Dev C++ la consola sale siempre muy pequeña? en: 19 Febrero 2015, 18:18 pm
Hola, tengo un pequeño problemita (si es que se le podría llamar así) con la consola cuando se ejecuta desde el Dev C++.
Luego de hacer algún programita, pulso el botón para compilar y ejecutar y al momento de aparecer la consola, aparece demasiado pequeña y tengo que estar cambiándole de tamaño en las propiedades cada vez que compilo-ejecuto un nuevo programa y hacer eso siempre me resulta muy molesto  :-\





Cuando abro directamente el cmd, la ventana me aparece de tamaño normal:




Quisiera saber si existe la forma para que cada vez que compile-ejecute mis programas desde el Dev C++ la consola no me aparezca pequeña y no tener que estar cambiándole el tamaño todas las veces  :-( . Quisiera poder configurarla solo una vez y que se mantenga ese tamaño para todas las demás veces. Si alguien me pudiera ayudar le estaría muy agradecido :)
13  Seguridad Informática / Seguridad / ¿Me sale un mensaje extraño al intentar entrar a mi hotmail desde Chrome? en: 14 Septiembre 2014, 10:26 am
Tengo un problema, mayormente uso Google Chrome y ahora que intento entrar a la página de hotmail (www.hotmail.com) me aparece lo de la imagen siguiente:

A

¿A alguien más le pasa lo mismo?  :P
14  Programación / Programación C/C++ / ¿Duda sobre la sobreescritura de una función miembro en una clase derivada? en: 21 Julio 2013, 07:44 am
Hola a todos, necesito una pequeña ayuda, resulta que conozco un poco de Java así que me animé a aprender C++ y ahora estoy practicando lo que es la herencia y el polimorfismo. Estoy que me tranqueo en la parte de la sobreescritura de métodos.

Verán, primero definí una clase base llamada Persona con dos atributos: "nombre" y "edad", además con 5 métodos públicos: "setNombre", "setEdad", "getNombre", "getEdad" y "metodo".

Luego definí dos clases derivadas de la clase Persona. Las clases derivadas son Alumno y Docente. Ambas clases con sus propios métodos set y get para manipular sus propios atributos (datos miembro) . Luego, en las clases derivadas Alumno y Docente redefiní la función miembro llamada "metodo" que heredaron de la clase base Persona.

Al final, en el método main, creé los objetos correspondientes a cada clase y luego hice que un puntero p de tipo de la clase base Persona ( Persona *p ) apunte a cada objeto creado para llamar a la función miembro "metodo" . Pensé que en cada caso se ejecutaría la función miembro correcta correspondiente a cada objeto pero al ver los resultados en pantalla me doy con la sorpresa de que en todos los casos se ejecuta la función miembro correspondiente a la clase base Persona. Tal vez estoy cometiendo un error y no sé como solucionarlo, espero que alguien me pueda ayudar, muchas gracias  :)

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. // Clase PERSONA
  7. class Persona {
  8.  
  9. public:
  10.   // Constructor con argumentos por defecto
  11.   Persona(string nombre = "", const int edad = 0);
  12.  
  13.   // Métodos
  14.   void setNombre(string nombre);
  15.   void setEdad(const int edad);
  16.   string getNombre();
  17.   int getEdad();
  18.  
  19.   void metodo();;
  20.  
  21. private:
  22.   string nombre;
  23.   int edad;  
  24. };
  25.  
  26. Persona::Persona(string nombre, const int edad) : nombre(nombre), edad(edad < 0 ? 0 : edad) {
  27.   /*
  28.    this->setNombre(nombre);
  29.    this->setEdad(edad);
  30.    */
  31. }
  32.  
  33. void Persona::setNombre(string nombre) {
  34.   this->nombre = nombre;  
  35. }
  36.  
  37. void Persona::setEdad(const int edad) {
  38.   this->edad = (edad < 0) ? 0 : edad;  
  39. }
  40.  
  41. string Persona::getNombre() {
  42.   return this->nombre;  
  43. }
  44.  
  45. int Persona::getEdad() {
  46.   return this->edad;  
  47. }
  48.  
  49. void Persona::metodo() {
  50.   cout << "Metodo de la clase base Persona" << endl;
  51. }
  52.  
  53.  
  54. // CLASE ALUMNO
  55. class Alumno : public Persona {
  56.  
  57. public:
  58.   // Constructor con argumentos por defecto
  59.   Alumno(string nombre = "", int edad = 0, string codigo = "");
  60.  
  61.   void setCodigo(string codigo);
  62.   string getCodigo();
  63.  
  64.   void metodo();
  65.  
  66. private:
  67.   string codigo;
  68. };
  69.  
  70. Alumno::Alumno(string nombre, int edad, string codigo)
  71.   : Persona(nombre, edad), codigo(codigo) {
  72. }
  73.  
  74. void Alumno::setCodigo(string codigo) {
  75.   this->codigo = codigo;  
  76. }
  77.  
  78. string Alumno::getCodigo() {
  79.   return codigo;  
  80. }
  81.  
  82. void Alumno::metodo() {
  83.   cout << "Método redefinido de la clase derivada Alumno" << endl;  
  84. }
  85.  
  86. // CLASE DOCENTE
  87. class Docente : public Persona {
  88.  
  89. public:
  90.   // Constructor con tres argumentos por defecto
  91.   Docente(string nombre = "", int edad = 0, float salario = 0.0);
  92.  
  93.   void setSalario(float salario);
  94.   float getSalario();
  95.  
  96.   void metodo();
  97.  
  98. private:
  99.   float salario;
  100. };
  101.  
  102. Docente::Docente(string nombre, int edad, float salario)
  103.   : Persona(nombre, edad), salario(salario < 0.0 ? 0.0 : salario) {
  104. }
  105.  
  106. void Docente::setSalario(float salario) {
  107.   this->salario = (salario < 0.0) ? 0.0 : salario;  
  108. }
  109.  
  110. float Docente::getSalario() {
  111.   return salario;  
  112. }
  113.  
  114. void Docente::metodo() {
  115.   cout << "Método redefinido de la clase base Docente" << endl;  
  116. }
  117.  
  118. int main()
  119. {  
  120.   Persona *p;
  121.   cout << "PERSONAS:" << endl;
  122.   p = new Persona("Dennis Ritchie", 19);      
  123.   p->metodo();
  124.  
  125.   cout << "\nALUMNOS:" << endl;
  126.   p = new Alumno("Bjarne Stroustrup", 22, "20080541x");
  127.   p->metodo();
  128.  
  129.   p = new Alumno("Esther Noemí", 19, "21130515h");
  130.   p->metodo();
  131.  
  132.   cout << "\nDOCENTES:" << endl;
  133.   p = new Docente("Riquelmer Vazques", 58, 1500.0);
  134.   p->metodo();
  135.  
  136.   cin.get();
  137.   return 0;  
  138. }
  139.  
15  Programación / Programación General / ¿(Python) Es una mala práctica/costumbre llamar desde __init__ a otros métodos? en: 13 Mayo 2013, 03:44 am
Hola, espero que me puedan orientar, estos días estoy practicando el lenguaje de programación Python (recién lo estoy aprendiendo) , tengo algunos conocimientos de Java y estoy tratando de aplicar esos conocimientos hacia Python. Tengo la siguiente duda, quiero saber si es que en Python, desde el método __init__ de alguna clase, es posible realizar llamadas a otros métodos de la misma clase  :P .

En Java, por ejemplo al declarar una clase persona, en un principio yo accedía directamente a los atributos de la clase para inicializarlos desde dentro del constructor, de la siguiente manera:

Código:
public class Persona {
    private String nombre;
    private int edad;
    
    public Persona(String nombre, int edad) {        
        this.nombre = nombre;
        this.edad = edad        
    }
    
    public String getNombre() {
        return nombre;
    }
    
    public int getEdad() {
        return edad;
    }        
      
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    public void setEdad(int edad) {
        this.edad = edad;
    }
}

Pero luego, me acostumbré a llamar a los métodos set desde dentro del constructor (para que estos se encarguen de la inicialización) como muestro a continuación:

Código:
public class Persona {
    private String nombre;
    private int edad;
    
    public Persona(String nombre, int edad) {        
        setNombre(nombre);
        setEdad(edad);        
    }
    
    public String getNombre() {
        return nombre;
    }
    
    public int getEdad() {
        return edad;
    }        
      
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    public void setEdad(int edad) {
        this.edad = edad;
    }
}

Bueno, intenté hacer lo mismo en Python. En ese nuevo lenguaje me sale de la primera forma:

Código:
class Persona:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

    def getNombre(self):
        return self.nombre

    def getEdad(self):
        return self.edad

    def setNombre(self, nombre):
        self.nombre = nombre

    def setEdad(self, edad):
        self.edad = edad

Y de la segunda forma lo hago así:

Código:
class Persona:
    def __init__(self, nombre, edad):
        self.setNombre(nombre)
        self.setEdad(edad)

    def getNombre(self):
        return self.nombre

    def getEdad(self):
        return self.edad

    def setNombre(self, nombre):
        self.nombre = nombre

    def setEdad(self, edad):
        self.edad = edad

Mi pregunta era si es que está bien eso que estoy haciendo, osea, llamar a los métodos set desde dentro del constructor de la clase (La segunda forma) . ¿Creen que sea una mala práctica?
16  Informática / Software / Luego de cerrar mi máquina virtual mi computadora se vuelve recontra lenta. en: 25 Enero 2013, 18:16 pm
Hola, tengo un problema y espero encontrar la solución, muchas gracias de antemano a los que me puedan ayudar. En mi computadora tengo el programa llamado vmWare, y siempre luego de usar alguna máquina virtual, cierro el programa y tengo problemas pues mi computadora se vuelve recontra lenta, y si escucho alguna música , esta demora en sonar, incluso cuando empieza a reproducirse lo hace entrecortándose. No sé cuál podría ser el problema porque mi computadora tiene recursos aceptables: Windows 7 Ultimate, 500 GB de disco, 8GB de Ram, 1GB de video DDR5, etc...  :(


También tengo este problema, la máquina virtual que tengo ocupa algo de 80 GB y se encuentra en la unidad D. Y cuando trato de desfragmentar dicha unidad, el desfragmentador (Auslogic) no lo puede hacer.
17  Informática / Software / ¿Qué programa usan las editoriales para editar libros con diseño profesional? en: 19 Diciembre 2012, 17:09 pm
Hola, siempre me he preguntado esto, no creo que las editoriales utilicen el Microsoft Word para poder editar sus libros ya que estos vienen con muchas cosas, ¿alguien sabe qué tipos de programas usan? También los periódicos que tipo de programas usan. ¿Se trata de un software procesador de texto parecido a Word o uno de diseño gráfico como Corel Draw? Muchas gracias.
18  Sistemas Operativos / Windows / ¿Debo desactivar las actualizaciones automáticas de windows? en: 4 Noviembre 2012, 07:23 am
Hola quería preguntarles si es que hay tendría problemas con las actualizaciones automáticas de windows (windows 7) si es que mi Windows no es original. Según había escuchado era que en esos casos tendría que desactivar las actualizaciones automáticas, pero quisiera estar seguro si es necesario.
19  Programación / Programación C/C++ / ¿Dev C++ me agrega cabeceras sin que los vea, como evitar eso? en: 27 Octubre 2012, 19:42 pm
Hola, yo pensé que la función getch() y sus derivadas eran parte de la biblioteca conio de Borland, pero veo que a pesar que estoy usando el IDE Dev C++ puedo utilizar dicha función. Según el ANSI C esa función no es una función de la biblioteca estándar, ¿debería usarlo a pesar que el Dev me lo permite?
A parte de esto, en mi Dev C++ parece que este automáticamente me agrega las cabeceras stdio.h y stdlib.h pues sin que las agregue me compila código que contiene funciones como scanf, printf, system, etc.
20  Foros Generales / Foro Libre / ¿Es seguro guardar mis copias de seguridad en mi máquina virtual? en: 23 Octubre 2012, 01:39 am
Hola, me surgió esta duda. Quería saber si es seguro copiar mis copias de seguridad en una máquina virtual. Lo que sucede es que tengo pensado crear una imagen de mi disco c y esa imagen (archivo) copiarlo en una carpeta dentro de una máquina virtual, para que luego cuando necesite recuperar dicha imagen recurra a mi máquina virtual y recuperar dicho archivo. No sé si sea seguro hacer eso, o si corro el riesgo de que la máquina virtual pierda esos archivos.  :rolleyes:
Páginas: 1 [2] 3 4 5 6 7 8 9
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines