Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Devolver matriz de punteros

Estas en el tema de Devolver matriz de punteros en el foro de C/C++ en Foros del Web. A ver si alguien me puede echar un cable, porque estoy atrapado con este tema. (pseudocódigo:) Tengo un array de punteros a objetos: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 05/05/2011, 18:10
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 16 años, 10 meses
Puntos: 1
Devolver matriz de punteros

A ver si alguien me puede echar un cable, porque estoy atrapado con este tema.

(pseudocódigo:)
Tengo un array de punteros a objetos:
Código C++:
Ver original
  1. cMiClase *MiArray[20];

y tengo un método que devuelve este array de cMiClase:
Código C++:
Ver original
  1. cMiClase* ........::getArray(){
  2.     cMiClase *p = *this->MiArray;
  3.     return *p;
  4. }

(Por alguna razón que todavía no entiendo, no puedo hacer directamente: return MiArray;)

Bueno, el caso es que ahora quiero recuperar mi array llamando a este método y recorrer alguna de sus posiciones:

Código C++:
Ver original
  1. cMiClase* ArrayRecuperado = ......getArray();
  2.  
  3. //y por ejemplo voy a cambiar una de sus posiciones:
  4.  
  5. if(ArrayRecuperado[3] != NULL) ArrayRecuperado[3] = NULL;

¿Por qué esto no me funciona? ¿Qué estoy haciendo mal? Yo creo que me he liado con tanto puntero...
__________________
Blog: http://a-dream-of-dragon.blogspot.com
  #2 (permalink)  
Antiguo 05/05/2011, 20:05
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Devolver matriz de punteros

Para devolver el puntero yo haria esto:

Código C++:
Ver original
  1. cMiClase* ........::getArray(){
  2.     cMiClase * p = this->MiArray;
  3.     return p;
  4. }

no entiendo porque no podes hacer return MiArray; Que error te da??

Y otra cosa cuando dice que no te funciona, que es lo que falla??
  #3 (permalink)  
Antiguo 06/05/2011, 04:53
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 16 años, 10 meses
Puntos: 1
Respuesta: Devolver matriz de punteros

Vale, creo que el error me lo daba porque es un array de punteros, para poder devolverlo, lo he cambiado así:

Código C++:
Ver original
  1. return *MiArray;

Lo que no entiendo es cómo una vez que tengo el puntero a la primera posición del array puedo moverme por el array con ese puntero que he obtenido.
__________________
Blog: http://a-dream-of-dragon.blogspot.com

Última edición por vrael; 06/05/2011 a las 06:54
  #4 (permalink)  
Antiguo 06/05/2011, 10:59
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Devolver matriz de punteros

Ya se cual es el error. Anoche no me di cuenta porque era tarde.
Al declara esto:

cMiClase *MiArray[20];

Estas haciendo un array bidimencional. Deberia ser simplemente asi:

cMiClase MiArray[20];
  #5 (permalink)  
Antiguo 06/05/2011, 14:10
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 16 años, 10 meses
Puntos: 1
Respuesta: Devolver matriz de punteros

mmm.....

La verdad es que lo estaba pensando. Corrigeme si me equivoco, pero en realidad, cuando defino un array en C++, lo que hace es que cada posición del array contiene un puntero hacia el tipo de dato contenido en él, no el propio objeto ¿no?

No se si me he explicado bien. Es decir, que al hacer cMiClase MiArray[20]; ya estoy diciendo: Array de 20 posiciones donde cada posición es un puntero hacia un objeto de tipo cMiClase ¿no?
__________________
Blog: http://a-dream-of-dragon.blogspot.com
  #6 (permalink)  
Antiguo 06/05/2011, 15:07
 
Fecha de Ingreso: diciembre-2010
Mensajes: 20
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Devolver matriz de punteros

No. Un arreglo de x es un arreglo de x no de x*.

Y para arreglos deberías usar un simple puntero al tipo. Incluso para arreglos multidimensionales es mejor así, a menos que el arreglo ocupe demasiada memoria (no es aconsejable reservar bloques contiguos que pasen del 1% del total de RAM).

Código C++:
Ver original
  1. // Es buen estilo inicializar todo puntero a 0.
  2. ClaseX* x = 0;
  3. ...
  4.  
  5. x = new ClaseX[ARRAY_SIZE];
  6. ...
  7. // Nota: Si x es 0 delete no realiza ninguna operación
  8. delete[] x;

Última edición por Aemilius; 06/05/2011 a las 15:19
  #7 (permalink)  
Antiguo 07/05/2011, 10:40
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 16 años, 10 meses
Puntos: 1
Respuesta: Devolver matriz de punteros

Ok, sin embargo todavía no consigo hacer lo que quiero.

Tengo 2 problemas actualmente:

1º Quiero crear un Array de 50 punteros a objetos "ClaseX", pero quiero que estos punteros estén inicializados a null:
Código C++:
Ver original
  1. ClaseX* arrayClaseX = new ClaseX[50];
  2.     for (int i=0; i<50; i++)
  3.         ClaseX[i] = NULL;

Sin embargo, me da este error:
Código C++:
Ver original
  1. error C2679: '=' binario : no se encontr&#243; un operador que adopte un operando en la parte derecha de tipo 'int' (o bien no existe una conversión aceptable)
__________________
Blog: http://a-dream-of-dragon.blogspot.com
  #8 (permalink)  
Antiguo 07/05/2011, 12:27
 
Fecha de Ingreso: abril-2011
Mensajes: 88
Antigüedad: 13 años
Puntos: 24
Respuesta: Devolver matriz de punteros

Código C++:
Ver original
  1. ClaseX* arrayClaseX[50];
  2. for (int i=0;i<50;i++)
  3. arrayClaseX[i]=NULL;
Esto te inicia el arreglo de 50 punteros a ClaseX, a NULL.

Después para crear uno de esos objetos:
Código C++:
Ver original
  1. arrayClaseX[n]=new ClaseX(argumentos);
__________________
Foros Desarrollo de Juegos
  #9 (permalink)  
Antiguo 07/05/2011, 16:10
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 16 años, 10 meses
Puntos: 1
Respuesta: Devolver matriz de punteros

ok, esta duda está clara. Muchas gracias.

En cuanto a mi problema incial, de como devolver un array de punteros a través de un método y como modificar ese array en otra clase, llamando a ese método, es que no lo consigo.

A ver si podeis ayudarme con esto (y ya no soy más pesado, lo prometo ):

Tengo esta clase A:

A.h
Código C++:
Ver original
  1. #include "claseX.h";
  2.  
  3. class A{
  4.  
  5.      private:
  6.           claseX* arrayClaseX[50]; //Defino 1 array de 50 punteros a objetos de tipo claseX
  7.      public:
  8.            //constructor que inicializa todas las posiciones del arrayClaseX a NULL
  9.            claseX* getArrayClaseX();  //Devuelve le puntero al array;
  10. };

A.cpp
Código C++:
Ver original
  1. #include "A.h";
  2.  
  3. //Solo pongo el método get para que quede más claro y resumido:
  4. claseX* A::getArrayClaseX(){ return *arrayClaseX;}

vale, ahora tengo la definición de una clase B que va a llamar a este método. Solo pongo el cpp para hacerlo más corto, y el include a la clase A también lo omito para agilizar.

B.cpp
Código C++:
Ver original
  1. #include "B.h";
  2.  
  3. void B::manejarArray()
  4. {
  5.      /*Variable en el B.h inicializada ya y todo: [B]claseX* Array[/B] */
  6.      claseX* ArrayNuevo;
  7.      ArrayNuevo = Array->getArrayClaseX();
  8.      ArrayNuevo[3] = NULL;
  9. }

¿Por qué esto no me funciona, qué estoy haciendo mal?
__________________
Blog: http://a-dream-of-dragon.blogspot.com
  #10 (permalink)  
Antiguo 07/05/2011, 16:18
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Devolver matriz de punteros

Está definición no es correcta:

Código C++:
Ver original
  1. claseX* getArrayClaseX();

Según eso estás devolviendo un puntero a ClaseX, no un puntero a un array.

Para eso tendrías que declararlo de la siguiente manera:


Código C++:
Ver original
  1. claseX*** getArrayClaseX();


De esta manera si estás devolviendo un puntero a un puntero a puntero ClaseX (recordemos que una variable de tipo array no es más que un puntero al primer elemento del array).

Etiquetas: c++
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:03.