2009-08-26 16 views
5

que es apropiado:definir montón de métodos estáticos en C++

class xyz { 
    static int xyzOp1() { } 
    static int xyzOp2() { } 
}; 

O

namespace xyz { 
    static int xyzOp1() {} 
    static int xyzOp2() {} 
}; 

¿Hay algo específico que podemos conseguir cuando definimos el uso de la etiqueta de clase en comparación con la etiqueta espacio de nombres?

¿También hay algo diferente en la gestión de la memoria, que tenemos que preocuparnos?

Respuesta

5

Sin ver el cuerpo de estas funciones, diría que los espacios de nombres son más apropiados. Con espacios de nombres, puede tener declaraciones using, de modo que no tenga que calificar completamente los nombres de las funciones cuando las llame.

El único caso en el que se usan clases es cuando los métodos estáticos tienen alguna relación con los objetos de la clase, p. cuando necesitan acceder a miembros privados de instancias. Según su descripción, parece que no va a crear ninguna instancia de xyz, por lo que no debería usar clases aquí.

Desde el punto de vista de la administración de memoria, no hay diferencia entre estos enfoques.

+0

Gracias, estaba escribiendo algunas rutinas de ayuda para obtener información del sistema de análisis/proc fs, estas rutinas de ayuda no requieren realmente una asociación con la clase, en mi requerimiento que tiene sentido utilizar espacio de nombres. Las cosas podrían haber cambiado si quisiera ocultar algunas de estas rutinas de ayuda, que otras rutinas de ayuda llaman pero no están expuestas, en ese escenario podría haber preferido un enfoque de clase. – harishvk27

8

Se refieren a cosas diferentes. En un contexto class, static significa que los métodos no requieren un objeto para actuar, por lo que se parecen más a funciones gratuitas. En un contexto namespace, significa que las funciones tienen vinculación interna por lo que son exclusivos de la unidad de traducción que se definen en.

Además, los miembros de una class son privados por defecto por lo que, como está escrito, sus funciones de clase solo se pueden llamar el uno del otro. Debería agregar un especificador de acceso public: o hacer que el class sea un struct para cambiar esto.

Si necesita un conjunto de funciones gratuitas y no necesita objetos de clase, entonces probablemente sea más adecuado definirlas como funciones que no son static en un espacio de nombres. Si se definen en línea en un archivo de encabezado, generalmente deben declararse inline. Esto está implícito si están definidos en un class.

1

El factor principal al elegir qué método usar es que las funciones mismas pueden querer operar en estado privado o utilizar métodos privados, en cuyo caso una clase estática es definitivamente la mejor opción.

Hay algunos otros matices, pero al final una clase estática le proporcionará más control en su encapsulación.