Tengo curiosidad acerca de los beneficios/detrimentos de diferentes declaraciones constantes y opciones de definición en C++. Durante mucho tiempo, me acaban de declararlos en la parte superior del archivo de cabecera antes de la definición de clase:¿Dónde declarar/definir constantes de alcance de clase en C++?
//.h
const int MyConst = 10;
const string MyStrConst = "String";
class MyClass {
...
};
Si bien esto contamina el espacio de nombres global (que sé que es una mala cosa, pero nunca he encontrado una larga lista de motivos por los que es malo), las constantes seguirán siendo delimitadas en unidades de traducción individuales, por lo que los archivos que no incluyen este encabezado no tendrán acceso a estas constantes. Pero puede obtener colisiones de nombres si otras clases definen una constante del mismo nombre, lo que posiblemente no es algo malo, ya que puede ser una buena indicación de un área que podría ser refactorizada.
Recientemente, decidí que sería mejor declarar constantes específicas de clase dentro de la definición de clase en sí:
//.h
class MyClass {
public:
static const int MyConst = 10;
...
private:
static const string MyStrConst;
...
};
//.cpp
const string MyClass::MyStrConst = "String";
La visibilidad de la constante se ajustará en función de si la constante sólo se utiliza internamente para la clase o es necesaria para otros objetos que usan la clase. Esto es lo que estoy pensando que es la mejor opción en este momento, principalmente porque puede mantener las constantes internas de clase privadas para la clase y cualquier otra clase que use las constantes públicas tendría una referencia más detallada a la fuente de la constante (por ejemplo, MyClass: : MyConst). Tampoco contaminará el espacio de nombres global. Aunque tiene el inconveniente de requerir una inicialización no integral en el archivo cpp.
También consideré mover las constantes en su propio archivo de encabezado y envolverlas en un espacio de nombres en caso de que alguna otra clase necesite las constantes, pero no toda la definición de clase.
Estoy buscando opiniones y posiblemente otras opciones que no había considerado todavía.
Sí, pero hay que usar 'static' o un espacio de nombres en el anonimato, en este caso - si no lo hace, en algunas implementaciones que contaminan el espacio de nombres global utilizado por el enlazador y obtener conflictos de nombres en la vinculación ... – hjhill