Ich schreibe ein Cocos2D-X-Spiel, wo der Spieler, Feinde und andere Charaktere ihre Attribute in einer CCMutableDictionary
, die eine Art Dekorator-Klasse für std::map<std::string, CCObject*>
ist, speichern. Auf einen Wert im Wörterbuch kann über die Methode CCMutableDictionary::objectForKey(const std::string& key)
zugegriffen werden.Proper std :: string in einer Header-Datei zu tun?
nun in einer Header-Datei von vielen meiner CPP-Dateien enthalten, ich habe wie diese für den Zugriff auf Werte in den Wörterbuch, ein paar const char * const
Saiten bekommt:
// in Constants.h
const char* const kAttributeX = "x";
const char* const kAttributeY = "y";
// in a .cpp file
CCObject* x = someDictionary->objectForKey(kAttributeX);
Also, mich zu korrigieren, wenn ich bin falsch, aber std::string
's Kopie Konstruktor wird aufgerufen und eine temporäre std::string
ist auf dem Stapel jedes Mal, wenn ich eine der oben genannten objectForKey
Methoden mit einem const char* const
aufrufen, richtig?
Wenn ja, ich fühle, dass es zur Laufzeit effizienter wäre, wenn diese konstanten Attributschlüssel bereits std::string
Objekte wären. Aber wie mache ich das richtig Weg?
definieren sie in der constants.h Datei wie folgt aus fein kompiliert, aber ich habe das Gefühl, dass etwas einfach nicht richtig ist:
// in Constants.h
const std::string kAttributeX = "x";
const std::string kAttributeY = "y";
Ich entschuldige mich, wenn diese Frage bereits gestellt hat. Ich konnte nicht die genaue Antwort finden, die ich hier auf StackOverflow suchte.
Wenn also die Zeichenfolgen in einer CPP-Datei definiert sind, wann werden sie tatsächlich instanziiert? –
@NatWeiss Sie werden zusammen mit allen anderen globalen Variablen instanziiert. –
Gilt das Problem mit den mehrfach definierten Variablen, wenn sie "const char * const" waren? Ich bin mir ziemlich sicher, dass es nicht so ist, aber ich verstehe nicht warum. Was gibt "const char * const" das Privileg, an einem einzigen Ort definiert zu sein, der seinen Wert enthält (viel schöner, IMO, insbesondere in Bezug auf Wartung)? – Brent212