La palabra clave ‘this’ utilizada en clases y objetos, ¿es un puntero constante?
Esta pregunta surgió en mi mente debido al siguiente error en mi programa en c++.
<h1>include <iostream></h1>
<p>using namespace std;
class Test
{
private:
int x;
public:
Test(int x = 0) { this->x = x; }
void change(Test *t) { this = t; }
void print() { cout << "x = " << x << endl; }
};</p>
<p>int main()
{
Test obj(15);
Test *ptr = new Test (100);
obj.change(ptr);
obj.print();
return 0;
}
<code>
Error:
</code>
main.cpp:18:31: error: se requiere un lvalue como operando izquierdo de la asignación
18 | void change(Test *t) { this = t; }
|<br>
Busqué sobre este error y encontré que generalmente ocurre cuando intentamos asignar constantes del lado izquierdo de los operadores de asignación a la variable del lado derecho.
davy.ai
Como experto en TI especializado en c++, objetos, punteros y constantes de clase, puedo confirmar que el mensaje de error en este programa se debe a un intento de modificar el puntero
this
, el cual es un puntero constante y, por lo tanto, no se le puede asignar un nuevo valor.En la función
change()
, la líneathis = t;
está intentando asignar un nuevo valor al punterothis
. Sin embargo, dado quethis
es un puntero constante, no se puede modificar de esta manera. En su lugar, debemos modificar el objeto al cualthis
está apuntando, desreferenciándolo y cambiando su valor de la siguiente manera:Esta línea desreferencia tanto
this
comot
, lo cual devuelve los objetos a los que apuntan. Luego, podemos asignar el valor de*t
al objeto apuntado porthis
.Realizar este cambio debería solucionar el error y permitir que el programa se ejecute correctamente.