programacion - miembros estaticos c++
¿Dónde coloco cadenas constantes en C++: miembros de clase estática o espacios de nombres anónimos? (9)
Necesito definir algunas cadenas constantes que serán utilizadas solo por una clase. Parece que tengo tres opciones:
Incruste las cadenas directamente en los lugares donde se utilizan.
Defínalos como miembros constantes estáticos privados de la clase:
//A.h class A { private: static const std::string f1; static const std::string f2; static const std::string f3; }; //A.cpp const std::string f1 = "filename1"; const std::string f2 = "filename2"; const std::string f3 = "filename3"; //strings are used in this file
Defínalos en un espacio de nombres anónimo en el archivo cpp:
//A.cpp namespace { const std::string f1 = "filename1"; const std::string f2 = "filename2"; const std::string f3 = "filename3"; } //strings are used in this file
Dadas estas opciones, ¿cuál recomendaría y por qué? Gracias.
Creo que el verdadero problema es: ¿las cadenas realmente solo se usan internamente cuando se implementa la clase, o se usan en otros lugares?
Para ser realmente delicado, trataría de mantener la interfaz de la clase lo más limpia posible, por lo que si las cadenas de nombre de archivo no deberían ser de ningún interés para el mundo "externo". Los escondería internamente solo en el archivo .cpp. Y en ese caso no creo que me molestaría con el espacio de nombres, sino que simplemente mantendría las cosas "estáticas" (es decir, internas al archivo .cpp).
De cualquier forma que lo hagas, debes tener cuidado con una cosa: no recomendaría el uso de objetos std :: string estáticos, en su lugar usa carácter estático *. La razón de esto se debe a problemas potenciales con el orden de inicialización. Supongamos que tiene una instancia estática de una clase cuyo constructor hace referencia a la cadena A::f1
. No hay garantía de que A::f1
se haya construido todavía, y se producirá un fallo, o peor aún, no se producirá un error, sino datos falsos.
La búsqueda de errores de orden de inicialización puede ser bastante desagradable, y todo puede verse bien en un proyecto, pero luego puede crear otro proyecto utilizando las mismas bibliotecas, y las diferencias sutiles en el orden de enlace harán que este error aparezca misteriosamente.
De las tres opciones, la única que deberías evitar es la # 1. No uses cookies mágicas en tu código. Al poner las constantes en un espacio de nombres o en una clase, facilitará la extensión y el mantenimiento de su código en el futuro.
Si sus constantes son de naturaleza global, entonces entre 2 y 3, importa poco. Lo que importa es que elijas uno y te quedes con él. Pero si tienes constantes que se aplican a una clase en particular, entonces deberían ser parte de esa clase.
Personalmente, usaría un espacio de nombres para la mayoría de las cosas.
Los pondría en el espacio de nombres anónimo en el archivo CPP. Los hace privados para la implementación y, al mismo tiempo, los hace visibles para las funciones que no son miembros que forman parte de la implementación (como el operator<<
).
Miembros estáticos de la clase.
Si la clase los usa en múltiples lugares, generalmente es más fácil mantener las cosas organizadas, y luego encontrar dónde lo definió todo, si las mantiene definidas en la clase que las usa. Definirlos en el lugar hace que sean difíciles de localizar y modificar posteriormente. Y optaría por la clase específica sobre el espacio de nombres anónimo para una definición y uso de clase más limpia.
Si las cadenas están destinadas a ser vistas por los usuarios de la clase, colóquelas en la clase. De lo contrario, ocúltelos en el espacio de nombres sin nombre del archivo de implementación.
Si se usan solo en un solo archivo, no es necesario exponerlos al mundo exterior incluyéndolos en el archivo de encabezado.
Si se usan y siempre se usarán solo en un solo lugar, entonces realmente no hay razón para no solo escribirlas como literales donde deben usarse.
Si se usan en varios lugares en el cpp, buscaría el espacio de nombres anónimo.
Otra opción que no mencionas es definirlas como variables estáticas dentro del cpp. esto es algo equivalente a la opción de espacio de nombres anónimo y más parecido a C que a C ++.
Si solo se usa en el archivo .cpp de la clase, no es necesario usar un espacio de nombres de ningún tipo, simplemente diga:
const std::string f1 = "filename1";
const std::string f2 = "filename2";
const std::string f3 = "filename3";
El uso excesivo de los espacios de nombres parece ser lo nuevo: no puedo ver personalmente la atracción.
Solo tenga las cadenas constantes en el alcance del archivo en el archivo de implementación, el espacio de nombres anónimo no es necesario para restringir su uso a esa clase solamente.
C ++ 003 Estándar C.1.2 Cláusula 3: conceptos básicos
Change: A name of file scope that is explicitly declared const, and not explicitly declared extern, has internal linkage, while in C it would have external linkage
Nota: el espacio de nombres anónimo ayuda a reducir los conflictos de nombres.