PDA

Ver la versión completa : Duda sobre C++



KaoS
09-04-2004, 18:01
Buenas chicos, a ver hoy me ha surgido la duda a mi, estoy probando 1 cosilla pero lo de los punteros sin tipo y yo aun no nos llevamos muy bien, planteo mi duda.

Stoy intentando hace runa función "reserve(elem,size);", que como su nombre indica reserve size elementos para el puntero elem. El problema es q quiero que el tipo de elem sea genérico.

Yo pensaba en principio q sería algo asi, pero claro esta q no es asi (xq no compila xD), tonces tengo q hacer casting en algún lado, no?

void reserve(void elem,int x){

elem = new void [x];
}

Bueno a ver si alguien me lo aclara un poquito q no termino de pillarle el tranquillo a esto xD.

Un saludo,

KaoS

gondar_f
10-04-2004, 21:13
Kaos no entendi muy bien un par de cosas, entre ellas
reserve(elem,size);", que como su nombre indica reserve size elementos para el puntero elem, porque size() devulve el tamaño de una variable y creo que tu te refieres a otra cosa.
Pero bueno a tu pregunta de crear elementos genericos, la respuesta son las plantillas (template), un ejemplo simple del todo seria:

//definicion de la plantilla
template <class TIPO> //puedes definir plantillas con vaios tipos genericos,
TIPO Max(TIPO a, TIPO b) { //pero cada tipo debe tener un nombre distinto.
return (a > b) ? a : b; //actualmente muchos en vez de class utilizan typename
}
//utilizacion de la plantilla
void main() {
int a=5, b=10, c;
float k=3.0, l=7.8, m;
c=Max(a,b); //es el compilador el encargado de comvertir TIPO en entero, float, ...
m=Max(k,l);
}


espero que hayas entendido mi explicacion (bueno si a esto se le puede llamar explicacion), y si no es asi admelo saber, que intentare darte una bastante mas completa, aunque te advierto que no soy ningun experto. Por cierto, si utilizas plantillas no tendras que usar casting ni nada por el estilo, ya que lo hace el compilador por ti.

Un Saludo

Giskard
11-04-2004, 20:47
el problema, creo, es que este tipo de ddefinicion de una función void reserve(void elem,int x), pertenece a la programación estructurada, y esta nos dice que la funcion debe tener n variables de entrada y una de salida, las de entrada deben ser de UN tipo cada una, es decir que no puedes poner ambigüedades como "void elem", puesto que el void es usado para funciones y no para variables.

Para esto que quieres hacer, se puede en orientación a objetos, creo que se llama polimorfismo, es decir, puedes declarar la misma funcion varias veces con diferentes variables, por ejemplo:

class nobreDeObjeto{
public:
void reserve(int elem,int x);
void reserve(float elem,int x);
void reserve(char elem,int x);
etc, etc.

gondar_f
12-04-2004, 19:06
Giscard, perdona, pero tu ejemplo es de funciones sobrecargadas, aunque bueno tienen mucho que ver con el polimorfismo, no son lo mismo.

Lo que si tienes razon en que las variables (que yo sepa) no pueden ser void, aunque si las funciones (no devuelven nada) y los punteros.

Un Saludo