2010-12-20 9 views
5

Me preguntaba si this-> debe ser utilizado tanto:¿Cuándo se debe usar esto->?

void SomeClass::someFunc(int powder) 
{ 
    this->powder = powder; 
} 

//and 
void SomeClass::someFunc(bool enabled) 
{ 
    this->isEnabled = enabled; 
} 

Me pregunto si este último es necesario ser adecuada o si isEnabled = habilitado sería suficiente.

Gracias

+2

¿Por qué no lo haces y lo intentas? .. esto-> solo se necesita cuando hay ambigüedad (por ejemplo, el primer caso, donde el parámetro tiene prioridad, pero hay otras situaciones, como algunos casos de plantilla poco claros). – falstro

+0

Sé lo que funciona y lo que no solo me refiero a cuál es el POO correcto – jmasterx

+9

OOP adecuado no tiene ningún comentario sobre el tema. Al igual que la ubicación de la abrazadera, es una cuestión de estilo de codificación. – stonemetal

Respuesta

4
this-> 

es necesario cuando se utiliza el miembro directamente sería ambiguo. Esto podría suceder con el código de la plantilla.

Considera:

#include <iostream> 

template <class T> 
class Foo 
{ 
    public: 
     Foo() {} 
    protected: 
     void testing() { std::cout << ":D" << std::endl; } 
}; 

template <class T> 
class Bar : public Foo<T> 
{ 
    public: 
     void subtest() { testing(); } 
}; 

int main() 
{ 
    Bar<int> bar; 
    bar.subtest(); 
} 

Este fallará ya llamar a la prueba() depende de un parámetro de plantilla. Decir que quiere decir la función que tendrá que hacer el mensaje this->testing(); o Foo<T>::testing();

error:

temp.cpp: In member function ‘void Bar<T>::subtest()’: 
temp.cpp:16:32: error: there are no arguments to ‘testing’ that depend on a template parameter, so a declaration of ‘testing’ must be available [-fpermissive] 
temp.cpp:16:32: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated) 
+1

Esto no se debe a la ambigüedad, sino a que la búsqueda de nombres dependientes se retrasa hasta el punto de creación de instancias. –

3

this es sólo un puntero al objeto en sí. Está hecho para facilitar la lectura, para que sepa que está haciendo referencia a las funciones o variables del objeto, no a algo dentro de la función.

No creo que haya otra buena razón para ello que no sea :-) legibilidad

También es bueno si se quiere evitar la referencia ambigua. Supongamos que tiene una variable global y una variable dentro de la función que tiene el mismo nombre, entonces this-> haría referencia a la variable global.

+0

En algunos casos, ayuda con la ambigüedad (podría decirse que es un problema de legibilidad). – Nate

1

Creo que en C++ se omite el this->, sin embargo, es probablemente una preferencia personal. Con o sin el código todavía hace lo mismo.

0

que tienden a seguir esta sencilla regla del pulgar:

  • Atributos: sin this, si no es un parámetro del método, entonces es obviamente un atributo de la clase (y tiendo a confiar en la convención de nombres de todos modos para distinguirlos)
  • Métodos: this->, para distinguir los métodos de clase de funciones exentas

El segundo también aporta consistencia, ya que podría ser necesario en template d code (y yo escribimos un montón de él, sobre todo en mis proyectos favoritos)

La razón detrás de esto es simple: escriba tanto como sea necesario para ser explícito (es decir, haga más fácil la vida de su lector), pero no una puntada más (esto sería desorden), que sigue a Antoine de Saint-Exupery:

Se logra la perfección, no cuando no hay nada más que agregar, pero cuando no queda nada más que quitar.

Cuestiones relacionadas