Estoy escribiendo un juego Cocos2D-X donde el jugador, los enemigos y otros personajes almacenan sus atributos en un CCMutableDictionary
, que es algo así como una clase de decorador para std::map<std::string, CCObject*>
. Se puede acceder a un valor en el diccionario a través del método CCMutableDictionary::objectForKey(const std::string& key)
.Forma correcta de hacer const std :: string en un archivo de cabecera?
Ahora, en un archivo de cabecera incluida por muchos de mis archivos .cpp, tengo unos const char * const
cadenas para acceder a los valores en los diccionarios, así:
// in Constants.h
const char* const kAttributeX = "x";
const char* const kAttributeY = "y";
// in a .cpp file
CCObject* x = someDictionary->objectForKey(kAttributeX);
Así, corrígeme si me estoy equivocado, pero el constructor de copias de std::string
se está llamando y hay un std::string
temporal en la pila cada vez que llamo a uno de los métodos objectForKey
anteriores usando un const char* const
, ¿verdad?
Si es así, creo que sería más eficiente en tiempo de ejecución si esas claves constantes de atributos ya fueran objetos std::string
. ¿Pero cómo hago eso derecho manera?
Definición de ellos en el constants.h presentar como la siguiente compila bien, pero tengo la sensación de que algo no está bien:
// in Constants.h
const std::string kAttributeX = "x";
const std::string kAttributeY = "y";
Mis disculpas si esta pregunta ya ha sido pedido. Parece que no pude encontrar la respuesta exacta que estaba buscando aquí en StackOverflow.
Entonces, si las cadenas están definidas en un archivo .cpp, ¿cuándo se crean instancias? –
@NatWeiss Se crearán instancias junto con todas las demás variables globales. –
¿El problema con las variables definidas varias veces se aplica cuando eran "const char * const"? Estoy bastante seguro de que no es así, pero no entiendo por qué. ¿Qué le da a "const char * const" el privilegio de ser definido en una sola ubicación que incluya su valor (mucho más agradable, IMO, especialmente en términos de mantenimiento)? – Brent212