2012-04-17 36 views
11

Considere la siguiente clase:variables C++ miembros

class A 
{ 
    A(); 
    int number; 
    void setNumber(int number); 
}; 

Se podría aplicar 'setNumber' de 3 formas:

Método 1: Utilice el puntero 'this'.

void A::setNumber(int number) 
{ 
    this->number = number; 
} 

Método 2: Utilice el operador de resolución de alcance.

void A::setNumber(int number) 
{ 
    A::number = number; 
} 

Método 3: En lugar, denotar todas las variables miembro con 'm' o '_' (esta es mi método preferido).

void A::setNumber(int number) 
{ 
    mNumber = number; 
} 

¿Es esto solo una preferencia personal, o hay un beneficio de elegir un método en particular?

+0

¿Por qué todo es privado? –

+1

@ R.MartinhoFernandes: Es un ejemplo, por simplicidad. –

+2

El tercero. No es necesario utilizar 'this->' en C++, excepto si se trata de una clase base con plantilla. Deje el ruido detallado en Java y PHP. –

Respuesta

12

Esto es principalmente una preferencia personal, pero permítanme compartir mi perspectiva sobre el tema desde el interior de una empresa donde se realizan muchos juegos pequeños simultáneamente (y por eso hay muchos estilos de codificación que se usan a mi alrededor).

Este enlace tiene varios buenos, relacionado, respuestas: Why use prefixes on member variables in C++ classes

Su Opción 1:

void A::setNumber(int number) 
{ 
    this->number = number; 
} 

En primer lugar, muchos programadores tienden a encontrar este engorroso, para escribir continuamente la 'presente -> '. En segundo lugar, y más importante, si alguna de sus variables comparte un nombre con un parámetro o una variable local, un reemplazo de búsqueda diseñado para decir, cambiar el nombre de 'número' podría afectar las variables de miembro ubicadas en el alcance de buscar-reemplazar como bien.

Su opción 2:

void A::setNumber(int number) 
{ 
    A::number = number; 
} 

El problema que he encontrado con esto, es que en las grandes clases, o clases con grandes funciones (donde no se puede ver la función o la clase tiene un nombre inesperado), el formato de A: :(cosa) se parece mucho a acceder a una parte de un espacio de nombres, por lo que puede ser engañoso. El otro problema es el mismo que el # 2 de la opción anterior, si sus nombres son similares a las variables que está utilizando, a veces puede haber confusión inesperada.

Su opción 3:

void A::setNumber(int number) 
{ 
    mNumber = number; 
} 

Ésta es la mejor de las tres opciones presentadas. Al crear (y mantener) una sintaxis que involucra un prefijo claro y significativo, no solo crea un nombre único que una variable local (o global) no compartirá, sino que lo hace inmediatamente claro donde se declara esa variable, independientemente del contexto en el que lo encuentres. Lo he visto hacer ambos como este 'mVariable' y así 'm_variable' y depende principalmente de si prefieres los guiones bajos a la concatenación en mayúsculas. Además, si su estilo tiende a agregar cosas como 'p' para punteros o 'g' s para globales, este estilo encajará bien y los lectores lo esperarán.

5

Opción 4:

void A::setNumber(int n) 
{ 
    number = n; 
} 

¿Por qué es el beneficio de usar el mismo nombre para un miembro de y un parámetro. Nada bueno puede salir de esto. Claro, está claro ahora, pero cuando tus métodos se hacen más grandes, y el prototipo ya no cabe en la pantalla, y hay algún otro código de desarrollador de escritura, puede olvidarse de calificar al miembro.

+2

Esto es básicamente el Método 3. –

+1

Como está escrito, esta no es una respuesta. – Sampson

+0

@JonathanSampson Estoy diciendo que él debería preferir ninguno. –

7

Es una cuestión de estilo, por lo tanto, preferencia personal, o una preferencia del equipo con el que está trabajando o el jefe del equipo con el que está trabajando.

+3

Vlad tiene razón. Solo asegúrate de que no importa qué estilo termines usando, no te vuelvas religioso al respecto. Es solo estilo, nada más. La clave es que necesitas entender qué está haciendo el código, independientemente del estilo en el que esté escrito, así que no lo pienses demasiado :) Solo sigue el código a menos que tengas una buena razón técnica para no hacerlo. – Carl

2

Yo diría que la elección entre métodos 1 y 3 es un asunto de estilo personal u organizativo.

El método 2 es inferior porque Class :: member normalmente denota una variable miembro estática, y por lo tanto causaría confusión si se usa para eliminar la ambigüedad entre un parámetro y una variable miembro.

0

Voy a estar de acuerdo con Luchian al proporcionar una mejor variante. Los otros ejemplos que proporciona son demasiado engorrosos o confusos.

Opción 4:

void A::setNumber(int aNumber) 
{ 
    theNumber = aNumber; 
} 

Esto es parte del estándar de codificación que utilizamos en mi empleador y es muy claro lo que está describiendo. No es notación húngara.