2010-03-05 24 views

Respuesta

12

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.

+0

+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. –

+0

@ 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. –

4

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.

0

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.

1

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.

1

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; 
    } 
} 
2

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.

Cuestiones relacionadas