c++ - guide - google code style java
Forma correcta de definir los métodos de espacio de nombres de C++ en el archivo.cpp (8)
Probablemente un duplicado, pero no es fácil de buscar ...
Dado un encabezado como:
namespace ns1
{
class MyClass
{
void method();
};
}
He visto method()
definido de varias maneras en el archivo .cpp:
Versión 1:
namespace ns1
{
void MyClass::method()
{
...
}
}
Versión 2:
using namespace ns1;
void MyClass::method()
{
...
}
Versión 3:
void ns1::MyClass::method()
{
...
}
¿Hay una forma "correcta" de hacerlo? ¿Alguno de estos "errores" en el sentido de que no todos significan lo mismo?
5 años después y pensé en mencionar esto, que se ve bien y no es malo
using ns1::MyClass;
void MyClass::method()
{
// ...
}
Elijo Num.3 (también conocido como la versión detallada). Es más tipeo, pero la intención es exacta para usted y para el compilador. El problema que publicaste tal como está es realmente más simple que el mundo real. En el mundo real, hay otros ámbitos para las definiciones, no solo para los miembros de la clase. Sus definiciones no son muy complicadas solo con clases, porque su alcance nunca se vuelve a abrir (a diferencia de espacios de nombres, alcance global, etc.).
Num.1 esto puede fallar con ámbitos distintos de las clases, cualquier cosa que se pueda volver a abrir. Entonces, puedes declarar una nueva función en un espacio de nombres usando este enfoque, o tus líneas podrían terminar siendo sustituidas por ODR. Lo necesitará para algunas definiciones (especialmente, especializaciones de plantillas).
Num.2 Esto es muy frágil, particularmente en bases de código grandes: a medida que cambian los encabezados y las dependencias, su programa no compilará.
Num.3 Esto es ideal, pero mucho para escribir: cuál es tu intención para definir algo . Esto hace exactamente eso, y el compilador se activa para asegurarse de que no ha cometido un error, una definición no está desincronizada con su declaración, etc.
Estoy usando la versión 4 (a continuación) porque combina la mayoría de las ventajas de la versión 1 (concisión de la definición resolutiva) y la versión 3 (ser explícita al máximo). La principal desventaja es que las personas no están acostumbradas, pero dado que lo considero técnicamente superior a las alternativas no me importa.
Versión 4: use la calificación completa usando alias de espacio de nombres:
#include "my-header.hpp"
namespace OI = outer::inner;
void OI::Obj::method() {
...
}
En mi mundo, frecuentemente uso alias de namespace porque todo está explícitamente calificado, a menos que no pueda (por ejemplo, nombres de variables) o sea un punto de personalización conocido (por ejemplo, swap () en una plantilla de función).
La versión 2 no es clara y no es fácil de entender porque no sabes a qué espacio de nombres pertenece MyClass
y es simplemente ilógico (¿la función de clase no está en el mismo espacio de nombres?)
La versión 1 es correcta porque muestra que en el espacio de nombres está definiendo la función.
La versión 3 es correcta también porque utilizó el operador de resolución ::
scope para hacer referencia al MyClass::method ()
en el espacio de nombres ns1
. Prefiero la versión 3.
Ver espacios de nombres (C ++) . Esta es la mejor manera de hacer esto.
La versión 3 hace que la asociación entre la clase y el espacio de nombres sea muy explícita a expensas de más tipeo. La versión 1 evita esto pero captura la asociación con un bloque. La versión 2 tiende a ocultar esto, así que evitaría ese.
Resulta que no es solo una "cuestión de estilo de codificación". Num. 2 lleva al error de enlace al definir e inicializar una variable declarada extern en el archivo de encabezado. Eche un vistazo al ejemplo en mi pregunta. Definición de constante dentro del espacio de nombres en el archivo cpp
Todas las formas son correctas, y cada una tiene sus ventajas y desventajas.
En la versión 1, tiene la ventaja de no tener que escribir el espacio de nombres delante de cada función. La desventaja es que obtendrá una idea aburrida, especialmente si tiene más de un nivel de espacios de nombres.
En la versión 2, usted hace que su código sea más limpio, pero si tiene más de un espacio de nombres implementado en el CPP, uno puede acceder directamente a las funciones y variables del otro, haciendo que su espacio de nombres sea inútil (para ese archivo cpp).
En la versión 3, tendrá que escribir más y sus líneas de función pueden ser más grandes que la pantalla, lo que es malo para los efectos de diseño.
También hay otra forma en que algunas personas lo usan. Es similar a la primera versión, pero sin los problemas de identación.
Es como esto:
#define OPEN_NS1 namespace ns1 {
#define CLOSE_NS1 }
OPEN_NS1
void MyClass::method()
{
...
}
CLOSE_NS1
Depende de usted elegir cuál es mejor para cada situación =]
La Guía de estilo de Googles C ++ dicta su versión 1, sin embargo, sin sangría.