Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - eleon

#21
Programación C/C++ / Re: Funciones virtuales
29 Julio 2012, 22:51 PM
Vale, pero entonces para qué sirve declarar un objeto de tipo "ClaseA" y reservar memoria de tipo "ClaseB", es decir, para qué sirve hacer esto:

ClaseA *puntero = new ClaseB.

Saludos.

EDITO:
Cita de: [L]ord [R]NA en 29 Julio 2012, 15:24 PM
Cuando escribes virtual en un metodo de una clase, es para obligar a la clase derivada a que tenga que implementar el metodo virtual, entiendase, tener que OBLIGATORIAMENTE añadirla al cuerpo de la clase y colocarle el cuerpo del metodo.

Para nada, acabo de probarlo y puedes hacer lo siguiente perfectamente:

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

class ClaseA
{
public:
  virtual void funcion () {cout << "Clase A";};
};

class ClaseB : public ClaseA
{

};

int main ()
{
ClaseB objeto;
objeto.funcion(); //Se llama a la función de "ClaseA"

cin;
return 0;
}


El compilador no te obliga a sobrecargar la función en la clase derivada si añades "virtual" en la clase base; cuando no encuentra la función en la clase derivada directamente usa la de la clase base.

La única utilidad que le he encontrado a "virtual" es al hacer lo siguiente: ClaseA *puntero = new ClaseB; entonces como el puntero es de tipo ClaseA no puedes leer la función de "ClaseB" si la has sobrecargado, por ello se añade virtual.

Entonces volvemos a la pregunta inicial, para qué sirve declarar un objeto de tipo "ClaseA" y reservar memoria de tipo "ClaseB", es decir, para qué sirve hacer esto:

ClaseA *puntero = new ClaseB.

Y si lo hacemos de la manera "habitual" es decir, tanto el tipo del puntero como la memoria reservada son de ClaseB, ¿para qué sirve añadir "virtual" en la clase base? si obtenemos el mismo efecto si no lo usamos (y eso es algo que he visto en muchos códigos).

Saludos.
#22
Programación C/C++ / Funciones virtuales
29 Julio 2012, 13:04 PM
Buenas, tengo dos dudillas acerca de las funciones virtuales, a ver si me las podéis resolver:

Código (cpp) [Seleccionar]
class ClaseA
{
public:
  virtual void funcion () {};

};

class ClaseB : public ClaseA
{
  void funcion () {};
};

int main ()
{
  ClaseA *objeto = new ClaseB;

}


Hemos creado un objeto de tipo "ClaseA" pero hemos reservado memoria del tamaño "ClaseB". Y al declarar "funcion" como virtual, cada vez que la llamemos estaremos accediendo a la que hay en la clase que hereda y no a la de la clase base. Pero, ¿de qué nos sirve exactamente esto?. ¿No sería lo mismo que declarar el objeto de tipo ClaseB y sobrecargar la función sin añadir "virtual"?:

Código (cpp) [Seleccionar]
class ClaseA
{
public:
  void funcion () {};

};

class ClaseB : public ClaseA
{
  void funcion () {};
};

int main ()
{
  ClaseB *objeto = new ClaseB; //Hemos sobrecargado "funcion" asi que se llamará a la de la clase que hereda

}



Y luego también he leído ejemplos en los que hace lo siguiente:

Código (cpp) [Seleccionar]
class ClaseA
{
public:
  virtual void funcion () {};

};

class ClaseB : public ClaseA
{
  void funcion () {};
};

int main ()
{
  ClaseB *objeto = new ClaseB;

}


Es decir, declaramos un objeto de tipo "ClaseB" y reservamos memoria también "ClaseB", sin embargo usa la función "virtual" en la clase base. ¿Por qué?, ¿para qué añadir "virtual" si sin ella automáticamente se sobrecarga la función y se llama a la de la clase que hereda (como en el ejemplo anterior)?.

Gracias y saludos.
#23
Programación C/C++ / Linker en VC++
24 Julio 2012, 15:16 PM
Buenas:

Seré muy patoso pero acabo de instalar VC++ y no veo el linker por ningún lado para agregar nuevas librerías.

¿Alguien me puede indicar?, gracias.
#24
Buena idea, gracias por la sugerencia.

Saludos.
#25
Buenas:

Quería saber si hay alguna forma de definir el tamaño de un array bidimensional mediante variables e inicializarlo. Ejemplo:

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main ()
{


   int columna = 3;
   int linea = 3;
   int array[columna][linea] = {5, 1, 2, 5, 1, 2, 5, 1, 2};
   return 0;
}


Esto da el siguiente error: error: variable-sized object 'array' may not be initialized|

Sin embargo si no lo inicializo el mismo código funciona bien:

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main ()
{


   int columna = 3;
   int linea = 3;
   int array[columna][linea];
   return 0;
}


O si lo inicializo pero defino el tamaño del array mediante valores numéricos y no variables también funciona bien:

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main ()
{
   int array[3][3] = {5, 1, 2, 5, 1, 2, 5, 1, 2};
   return 0;
}


Entiendo que si el tamaño lo definimos con variables no es lógico que lo inicialicemos porque al variar el valor de la variable y definir de nuevo el array pueden no caber todos los elementos. Pero quizá haya algún "truquillo" puesto que la idea es aumentar el tamaño de los array (no en tiempo de ejecución logicamente) y eso no supondría ningún problema al compilar.

¿Alguna idea para que funcione el primer ejemplo?. Gracias.
#26
Muchas gracias, funciona a la perfección.

Me gustaría preguntarte acerca de más instrucciones de ese tipo aunque no tengan que ver con las clases, es decir, quisiera informarme sobre instrucciones como esa que son poco comunes de ver. Si no hay una recopilación de tal cosa, ¿conoces alguna lista donde aparezcan todas las instrucciones que componen las librerías estándar de C++?.

Gracias de nuevo. Saludos.
#27
Programación C/C++ / Pasar una clase a otra
13 Julio 2012, 11:16 AM
Buenas:

Bien sabemos que en C se puede hacer lo siguiente:

typedef struct {
int x;
int y;
} Estructura1;

int main ()
{
Estructura1 *puntero = malloc (Estructura1);
void* puntero_void = puntero; //El puntero void puede apuntar a la misma dirección que cualquier otro puntero
puntero = puntero_void; //Y viceversa. Un puntero de un tipo puede apuntar a la misma dirección que un puntero void. Pero al hacer esto lo que conseguimos es darle una estructura a esa zona de memoria

return 0;
}


Bien, ese último punto no consigo simularlo en C++, no consigo hacer que un puntero de tipo "Clase1" apunte a la misma dirección que un puntero de tipo "void".

¿Alguna idea?.

Saludos.
#28
Puedes obtener el valor de la clase a modificar y pasárselo a la clase "modificadora". Si lo quieres hacer por punteros aqui tienes un ejemplo:

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

//La clase que contiene las variables que queremos modificar
class Clase_1
{
   public:
       int* devolver_puntero_coord_x () {return &coord_x;}
       int coord_x; //La variable está declarada como pública para comprobar si lo hemos hecho bien.
};

//La clase desde la cual vamos a modificar los valores de la clase superior
class Clase_2
{
   public:
       void modificar_coord_x (int* coord_x, int nuevo_valor);
};

void Clase_2::modificar_coord_x (int* coord_x, int nuevo_valor)
{
   *coord_x = nuevo_valor;
}

int main ()
{
   Clase_1 objeto_modificado;
   objeto_modificado.coord_x = 10; //Le damos un valor inicial para ver si se modifica o no
   cout << "Coordenada X: " << objeto_modificado.coord_x; //Comprobamos que el valor inicial almacenado es 10

   Clase_2 objeto_modificador; //Objeto de la clase desde la que queremos hacer modificaciones
   objeto_modificador.modificar_coord_x (objeto_modificado.devolver_puntero_coord_x(), 20); //Llamamos a la funcion para modificar el valor.
                                                                        //Como primer parámetro le pasamos el puntero con la función de la Clase 1.
                                                                        //Como segundo parámetro le pasamos el nuevo valor.

   cout << endl << "Coordenada X: " << objeto_modificado.coord_x; //Comprobamos si se ha modificado o no.

   cin;
   return 0;
}


Saludos.
#29
Gracias, muy interesante, le echaré un vistazo.
#30
Buenas:

Con el fin de practicar más a fondo photoshop, me ofrezco para hacer firmas, fondos, logos, banners, etc.

Advierto, mi nivel no es alto, así que no prometo nada, pero me defiendo lo suficiente como para hacer cosas decentes.

Con que me déis los siguientes datos me busco la vida:

1 - Tipo de imagen: Firma, logo, fondo para vídeo/presentación, banner, etc.
2 - Tamaño: Ancho x Alto píxeles.
3 - Alguna carácterística: personajes o efectos que querríais ver, texto o nick, etc.

Me gustaría ingeniármelas por mi cuenta pero también podéis apuntar más datos sin problema: colores, posiciones, estilos, etc.

Cuando lo tenga listo lo posteo. Saludos.