C/Visual C - Metodo que devuelve un puntero

 
Vista:

Metodo que devuelve un puntero

Publicado por Luis (1 intervención) el 05/07/2004 12:47:38
Repito esta pregunta porque no la he formuado correctamente:

class Caja {
private:
char a[20]:
public:
char *getA (){ return a};
void setA(char* valorA){strcpy(a,valorA);}

};

El atributo es un array estatico, es decir, no tengo que hacer new ni delete. Hay algun problema en retornar a con el metodo getA() así

Caja caja;
char *temporal=caja.getA();

No sé si cuando el objeto caja deje de exisitir temporal se va a quedar apuntando a algo que no existe. O como al atributo a está declarado en la case como un array estático no hay problema.

Gracias y perdon por no formular antes correctamente la pregunta.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Metodo que devuelve un puntero

Publicado por Nicolas (183 intervenciones) el 05/07/2004 22:11:04
Hola!!!

char a[20]: no se pone asi, se pone asi:
char a[20]; // Tenis un dos puntos en vez de punto y coma

Lo otro, es que a es una direccion de memoria, no es una variable, y lo q estas haciendo al hacer char* getA() {return a;} (el punto y coma va adentro de la llave) es devolver el puntero.

Salu2!!!!!

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo que devuelve un puntero

Publicado por Luis (1 intervención) el 06/07/2004 09:52:21
Gracias, pero no me has resuelto nada. Sé que lo que devuelvo es un puntero, pero hay algún problema en devolver el puntero (tal como yo lo hago) a ese atributo de la clase (problema cuando se destruya el objeto)??????.
Por favor, estoy un poco desesperado. Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo que devuelve un puntero

Publicado por chuidiang (677 intervenciones) el 06/07/2004 10:06:42
El atributo deja de existir cuando deja de existir la instancia de la clase.
Si devuelves un puntero, dejará de tener sentido cuando desaparezca la instancia. El puntero quedará a apuntando a una dirección de memoria que no es válida.

Para que no hubiera problema, deberías declarar el array static de esta forma

class A
{
private:
static char a[20];
...
};
}

Este atributo no desaparece nunca. Existe incluso aunque no haya instancias de Caja y se puede acceder a el con Caja::a (si fuera público).

El problema es que es compartido por todas las instancias de la clase Caja

Caja caja1,caja2,caja3;

Tanto caja1 como caja2 como caja3 tienen el mismo atributo, todas devuelven el mismo puntero y si cambias el contenido de una de ellas, cambia para todas.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo que devuelve un puntero

Publicado por Luis (1 intervención) el 06/07/2004 14:21:47
Una última cosa..¿tengo que crear un constructor copia para copiar el atributo static char a[20]. O como es estatico no hece falta, es decir, tengo que hacer

class A ::A (const A &objetoA)
{
strcpy(a,objetoA.a);
}

o no tengo que hacerlo. Es que como son punteros........

Gracias

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo que devuelve un puntero

Publicado por chuidiang (677 intervenciones) el 06/07/2004 15:47:53
Como te comenté antes, ese atributo estático está compartido por todas las instancias de la clase, así que no hace falta compiarlo, porque en tu constructor copia

class A ::A (const A &objetoA)
{
strcpy(a,objetoA.a);
}

la a del strcpy es exactamente el mismo puntero que objetoA.a
Tal cual lo tienes, te daría lo mismo hacer

strcpy (a,a);
strcpy (a, objetoA.a);
strcpy (objetoA.a, objetoA.a);
o no hacer nada

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar