¿Cuándo debo hacer uso explícito del puntero "este"?

Resuelto asked hace 15 años • 12 respuestas

¿ Cuándo debo escribir explícitamente this->memberen un método de una clase?

 avatar Jun 15 '09 01:06
Aceptado

Por lo general, no es necesario, this->está implícito.

A veces, existe una ambigüedad en el nombre, donde se puede utilizar para eliminar la ambigüedad de los miembros de la clase y las variables locales. Sin embargo, aquí hay un caso completamente diferente en el que this->se requiere explícitamente.

Considere el siguiente código:

template<class T>
struct A {
   T i;
};

template<class T>
struct B : A<T> {
    T foo() {
        return this->i; //standard accepted by all compilers 
        //return i; //clang and gcc will fail
        //clang 13.1.6: use of undeclared identifier 'i'
        //gcc 11.3.0: 'i' was not declared in this scope
        //Microsoft C++ Compiler 2019 will accept it
    }

};

int main() {
    B<int> b;
    b.foo();
}

Si lo omite this->, algunos compiladores no sabrán cómo tratarlo i. Para indicarle que iefectivamente es miembro de A<T>, para any T, this->se requiere el prefijo.

Nota: aún es posible omitir this->el prefijo usando:

template<class T>
struct B : A<T> {
    int foo() {
        return A<T>::i; // explicitly refer to a variable in the base class 
        //where 'i' is now known to exist
    }

};
ASk avatar Jun 14 '2009 18:06 ASk

Si declara una variable local en un método con el mismo nombre que un miembro existente, tendrá que usar this->var para acceder al miembro de la clase en lugar de a la variable local.

#include <iostream>
using namespace std;
class A
{
    public:
        int a;

        void f() {
            a = 4;
            int a = 5;
            cout << a << endl;
            cout << this->a << endl;
        }
};

int main()
{
    A a;
    a.f();
}

huellas dactilares:

5
4

PaV avatar Jun 14 '2009 18:06 PaV