Puntero a esto en C++

Quiero escribir una línea de código que devuelva un puntero a this, debido a una matriz (std::vector<foo**>). Pensé en usar una referencia (&this), pero no funcionó.

Si necesita alguna aclaración, hágamelo saber.

EDITAR: para aclarar lo que estoy haciendo, estoy tratando de acceder al objeto directamente usando la matriz. Al igual que: (*ARRAY.at(i))->foo("bar");. Algunas personas dicen que es imposible hacer un puntero. Si es así, ¿cómo accedería al objeto directamente usando la matriz?

preguntado el 02 de julio de 12 a las 19:07

std::vector<foo**> parece una muy mala idea. -

this es un puntero, específicamente a la instancia del objeto. Para devolver un puntero a this implica cambiar la instancia interna desde fuera de la clase. Eso probablemente sería malo. ¿Qué estás haciendo realmente? -

"Pensé en usar una referencia (&this), pero no funcionó." Quieres decir *this? -

Aclaraciones se encuentran las necesario. -

Si solo desea acceder a él directamente usando una matriz, ¿por qué no puede simplemente poner esto en el elemento de la matriz? alguna matriz de punteros [0] = esto; ? -

5 Respuestas

No puedes tener un puntero a this, porque no es una variable, es una palabra clave reservada que se traduce en un puntero al objeto actual.

En la implementación de los compiladores, puede haber una variable local de la función que respalda el this puntero, pero es un detalle de implementación y su dirección es inaccesible para el programador.

Lo que intentas hacer es evil, pero si realmente quieres hacerlo, tendrás que crear la variable tú mismo:

foo** evil_ptr_to_ptr = new foo*(this);
ARRAY.push_back(evil_ptr_to_ptr);

y en algún momento en el futuro tendrás que eliminarlo:

// assuming you got all the elements in the array in the same way:
for(int i = 0; i < ARRAY.size(); ++i) {
  delete ARRAY[i];
}

Respondido 02 Jul 12, 19:07

@lkjoel usando el operador de dirección (&). Devuelve la dirección del puntero en la pila de la función actual. - Ricardo J. Ross III

@Richard, lo intenté (&this), pero da un mensaje de error: error: lvalue required as unary ‘&’ operand - MiJyn

@RichardJ.RossIII - no. No es posible utilizar el & en this. Las this puntero no es un valor l. Es una expresión (aunque especial), como 2+1. Es como intentar calcular &(2+1), y en ambos casos, obtendrá el mismo error, que la operante del operador unario & no es un valor l. - luis.espinal

Y quien rechazó la respuesta de Ivella no es consciente de su propia ignorancia. La respuesta de Ivella (como la de AndreyT arriba) es correcta (y ergo, +1 por ello). - luis.espinal

¡Gracias! Eso respondió a mi pregunta :D - MiJyn

En c ++ this no es un valor l. Por esta razón, no es posible crear un puntero a this. Por la misma razón, tampoco es posible vincular una referencia directamente a this.

Respondido 02 Jul 12, 19:07

Interesante. ¿Por qué no es un lvalue (const) sin embargo? Ciertamente parece uno (tiene nombre y todo). - Konrad Rodolfo

@Konrad Rudolph: Porque cuando se trata de rvalores de tipos escalares, el concepto de const no se aplica en absoluto. Los valores R de los tipos escalares no pueden ser constantes o no constantes. Ver 3.10/9: "Los valores r de clase pueden tener tipos calificados cv; los valores r que no son de clase siempre tienen tipos no calificados cv". - Hormiga

los operadores de asignación sobrecargados devuelven regularmente una referencia a this ... Supongo que eso es un rvalue? - AJG85

@Andrey Mi pregunta era por qué no es un lvalor, aunque; no rvalor. - Konrad Rodolfo

@AJG85 Los operadores sobrecargados devuelven referencias a *this que es una bestia completamente diferente. - Konrad Rodolfo

El puntero this se pasa como argumento oculto a todas las llamadas a funciones miembro no estáticas y está disponible como una variable local dentro del cuerpo de todas las funciones no estáticas.

Por lo tanto, tomar la dirección de este puntero no tiene sentido.

Considere esta función miembro no estática:

void my_struct::my_func(int a);

Cuando lo llama en my_struct, el compilador hace esto bajo el capó:

void my_struct__my_func(my_struct* this, int a);

Dado el hecho de que el puntero this se pasa por valor, tomar su dirección le dará la dirección de algo que ya no existirá después de que la función regrese.

Respondido 02 Jul 12, 19:07

Ya tienes muchas respuestas correctas, pero trata de pensarlo de manera diferente:

Suponga que tiene un objeto de su clase. foo asignado en alguna dirección en su memoria. Esta dirección está efectivamente representada por this en el ámbito de su clase. Ahora, dice que necesita otra dirección para alguna variable que mantenga la dirección del objeto original. Esta variable tendría que declararse y tener la duración de su objeto; obviamente, tal variable no existe por defecto, ya que no tendría mucho sentido crear una. Si quieres mantener foo** en su contenedor, lo más probable es que tenga que mantener otro contenedor de foo*, por lo que el primero puede señalar al segundo. Bueno, de nuevo, lo más probable es que no tenga sentido hacerlo y supongo que deberías resolver tu problema de otra manera. (Es posible que desee presentar el problema en SO y obtener ayuda).

Respondido 02 Jul 12, 19:07

Como señalaron otras respuestas/comentarios, this es un puntero en sí mismo.

Incluso si pudieras llevar un puntero a this: this es una variable local, local al método que está ejecutando, y es un puntero al objeto con el que está trabajando.

Devolviendo el puntero a this tendría el mismo efecto que devolver el puntero a cualquier otra variable local: devolverá basura, porque acaba de dejar el alcance donde this Fue definido.

EDITAR: para aclarar lo que estoy haciendo, estoy tratando de acceder al objeto directamente usando la matriz. Así: (*ARRAY.at(i))->foo("bar");. Algunas personas dicen que es imposible hacer un puntero. Si es así, ¿cómo accedería al objeto directamente usando la matriz?

Regreso this, guárdelo en su matriz y acceda de esta manera: myArray[idx]->foo("bar")

Una vez más, this es un puntero a su objeto.

EDITAR: Estoy corregido. this es una expresión rvalue implementada como parámetro de método oculto, que tiene una vida útil de una variable local. :)

Respondido 04 Jul 12, 00:07

this is no una variable local, this es una expresión lvalue que se evalúa como el puntero del objeto actual que se está llamando. Dicho esto, generalmente el compilador los implementa como parámetro de función internamente, lo que no es visible para el usuario. - lvella

@lvella: this es un valor expresión que se evalúa como el puntero del objeto actual. - Hormiga

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