¿Dónde colocaría las constantes globales en una aplicación C++? Por ejemplo, ¿los pondría en una clase? En una estructura?¿Dónde debería poner las constantes globales en un programa C++?
Respuesta
Usaría un espacio de nombres para las constantes globales que no están muy fuertemente asociadas con una sola clase. En este último caso, los pondría en esa clase.
Realmente las constantes globales (nivel de aplicación) deben estar en el espacio de nombres de la aplicación (siempre que la aplicación esté dentro de su propio espacio de nombres, como debería ser). Para las constantes de nivel de módulo, el espacio de nombre propio del módulo es el lugar natural.
El mejor enfoque es colocarlos en el mismo espacio de nombres al que pertenecen. Una aplicación C++ grande generalmente tendrá muchos módulos, cada uno con su propio conjunto de constantes. Cada módulo debe estar en un espacio de nombres, con sus constantes también.
Una opción es ponerlos en una clase como miembros no estáticos y poner un objeto de ese tipo dentro de la función main(). Eso simplifica hacer que no sean globales cuando lo averigüe, por la razón que sea.
Como regla general, los coloco en cualquier lugar que resulte en que no tengan irritantes prefijos tipo C.
Así, por ejemplo, si sus constantes se denominan mylib_foo
, mylib_bar
, entonces deben estar en mibiblioteca espacio de nombres y ser mylib::foo
y mylib::bar
.
Si mibiblioteca espacio de nombres contiene constantes circle_max_radius
, sphere_max_radius
, rectangle_max_width
, rectangle_max_height
, donde Círculo, Esfera y rectángulo son clases, entonces deberían estática miembros de la clase.
max
no es un prefijo "irritante", es bastante sensata ya que es un modificador descriptivo más que un posesivo ("radio max de un círculo"). Entonces puede quedarse.
Una posible forma es una clase con funciones miembro estáticas que devuelven las constantes. Utilizo esto cuando necesito constantes que son más que tipos básicos u objetos simples.
class Constant
{
public:
static const ComplexObject& getComplexObject()
{
static ComplexObject constObj = createComplexObject();
return constObj;
}
private:
static ComplexObject createComplexObject()
{
ComplexObject obj;
obj.setValue(1);
return obj;
}
}
Para constantes locales en un solo archivo .cpp, el mejor enfoque es declarar en un espacio de nombres en el anonimato, así:
namespace {
int const seconds_per_minute = 60;
int const minutes_per_hour = 60;
}
para las constantes que deben ser visibles para todo el programa, la solución más simple es crear un namspace (nombrado) para ellos, y poner eso en un archivo de encabezado.
Si hay (o podría haber) algunas operaciones para ir con ellos, en su lugar, probablemente debería crear un singleton class para ellos. Por ejemplo, es bastante común que mis programas tengan una clase singleton llamada "configuración" que lea las constantes de inicio (cosas como direcciones IP y cosas que no quiero codificar) desde un archivo de configuración o el registro o algo como eso.
- 1. Dónde poner las variables globales en Rails 3
- 2. ¿Las constantes globales son un antipatrón?
- 3. ¿Dónde debería definir las funciones globales en ExtJS 4 MVC?
- 4. ¿Dónde se almacenan las variables constantes en C?
- 5. En Code Igniter, ¿dónde debería declarar mis variables globales?
- 6. Constantes globales en PHPUnit
- 7. Constantes globales en Groovy
- 8. ¿Dónde debería poner mi código JavaScript?
- 9. Constantes globales en F # - cómo
- 10. ¿Dónde debería poner mis pruebas JUnit?
- 11. ¿Dónde debería poner la clase base vacía?
- 12. ¿Dónde poner las afirmaciones?
- 13. ¿Cómo se usan variables globales o valores constantes en Ruby?
- 14. C ¿dónde definir un mutex en un programa de multiproceso?
- 15. Cómo declarar y utilizar NSString constantes globales
- 16. ¿Dónde poner las funciones de conversión?
- 17. ¿Se pueden declarar las constantes globales en JavaScript?
- 18. Objective-C typedef enum en el archivo de constantes globales
- 19. ¿Dónde deberían colocarse las funciones Symfony "globales"?
- 20. ¿Dónde declarar las constantes de clase?
- 21. Symfony 2 - ¿Dónde debería poner una clase de utilidad?
- 22. Java: ¿dónde debería poner código de lógica de oyente anónimo?
- 23. ¿Dónde debería poner Py_INCREF y Py_DECREF en este bloque en la extensión Python C?
- 24. ¿Las constantes están ancladas en C#?
- 25. ¿Dónde declarar/definir constantes de alcance de clase en C++?
- 26. ¿Cuánto código debería uno poner en un constructor?
- 27. ¿Dónde debería colocar las interfaces para MEF?
- 28. ¿En qué carpeta debo poner plantillas parciales compartidas "globales"?
- 29. ¿Dónde pongo el archivo de constantes para Codeigniter (PHP)?
- 30. ¿Dónde debería poner funciones de utilidad comunes para las pruebas Perl .t?
+1, pero para las constantes a nivel de módulo que no necesitan ser visibles para la declaración de clase, utilizo un namspace anonomioso. –
@ T.E.D. Depende de lo que sea tu "módulo" - Estaba pensando en una unidad más grande que consta de varias clases. Si por "módulo" te refieres a una sola unidad de compilación, estoy totalmente de acuerdo contigo. –