Dirección del puntero devuelto por la función

Intento obtener la dirección de un puntero que devuelve una función miembro de clase:

class Test{
    ...
    char* d;
    ...
    char* getData(){
        return d;
    }
    ...
}

Ahora trato de obtener la dirección de d (supongamos que *d tiene un valor válido):

Test t; 
char** pd = &t.getData();

Esto da un error de sintaxis y no se compilará en VC2010. ¿Cómo puedo obtener la dirección de la variable de puntero miembro?

preguntado el 24 de agosto de 12 a las 04:08

no puedes hacer-> char** getData(){ return &d; } , char** pd = t.getData(); -

¿Puedes publicar el error de sintaxis que tienes? -

2 Respuestas

Version corta: Estás tratando de tomar la dirección de un rvalue, lo cual es ilegal.

Versión ligeramente más larga: Cuando tu lo hagas t.getData(), la *d se devuelve por valor. Esto es fácil de olvidar porque la mayoría de las veces, cuando trabaja con punteros, no se preocupa por pasar por valor versus pasar por referencia. Simplemente devuelve el puntero ya que es pequeño.

Aquí,

char** pd = &t.getData();

el valor de retorno de t.getData es una copia del puntero, y es un valor, lo que significa que es temporal y dejará de existir una vez que finalice la expresión. No puede tomar la dirección de un rvalue por ese motivo; sería inválido tan pronto como finalice la declaración. Sin embargo, si pone esa dirección en un valor l, funciona bien:

Test t;
char* temp = t.getData(); 
char** pd = &temp;

Eso es porque ahora la temperatura es un lvalor, y puede tomar su dirección.

Sin embargo, para lo que está tratando de hacer, es mejor que tenga getValue() devolver un char**.

Respondido 24 ago 12, 06:08

+1. Lo que dices es cierto, y está bien explicado. Pero puede ser útil mencionar que al final de su segunda versión, pd tiene la dirección de temp, no del miembro original t.d. - jogojapan

Su getData() La función devuelve una copia del puntero. Si desea tomar la dirección del miembro del puntero original, deberá cambiarla para que devuelva una referencia al puntero:

char *&getData() { return d; }

(Si devolver referencias a punteros internos y tomar su dirección es una buena idea desde el punto de vista del diseño es un asunto diferente).

Respondido 24 ago 12, 06:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.