2012-04-18 14 views
9

मैं एक कोकोस 2 डी-एक्स गेम लिख रहा हूं जहां खिलाड़ी, दुश्मन और अन्य पात्र CCMutableDictionary में अपने गुणों को संग्रहीत करते हैं, जो std::map<std::string, CCObject*> के लिए सजावटी वर्ग का कुछ हद तक है। CCMutableDictionary::objectForKey(const std::string& key) विधि के माध्यम से शब्दकोश में एक मूल्य का उपयोग किया जा सकता है।हेडर फ़ाइल में const std :: स्ट्रिंग करने का सही तरीका?

अब, मेरी सीपीपी फ़ाइलों के कई रूप से शामिल एक हेडर फाइल में, मैं कुछ const char * const तार शब्दकोशों में मूल्यों तक पहुँचने के लिए इस तरह मिल गया है,:

// in Constants.h 
const char* const kAttributeX = "x"; 
const char* const kAttributeY = "y"; 

// in a .cpp file 
CCObject* x = someDictionary->objectForKey(kAttributeX); 

तो, मुझे ठीक कर लें मैं मैं गलत हूं, लेकिन std::string की कॉपी कन्स्ट्रक्टर को बुलाया जा रहा है और एक अस्थायी std::string हर बार objectForKey विधियों में से एक को const char* const का उपयोग करके कॉल करता है, ठीक है?

यदि ऐसा है, तो मुझे लगता है कि यह रनटाइम पर अधिक कुशल होगा यदि उन निरंतर विशेषता कुंजी पहले से ही std::string ऑब्जेक्ट्स थीं। लेकिन मैं यह कैसे कर सकता हूं कि दाएं रास्ता?

Constants.h में उन्हें परिभाषित फ़ाइल निम्न तरह ठीक संकलित है, लेकिन मुझे लगता है कि कुछ सिर्फ सही नहीं है:

// in Constants.h 
const std::string kAttributeX = "x"; 
const std::string kAttributeY = "y"; 

मेरे क्षमायाचना करता है, तो यह सवाल पहले से ही कहा गया है। मुझे स्टैक ओवरफ्लो पर सटीक उत्तर नहीं मिल रहा था।

उत्तर

18

आपके द्वारा लिखे गए कोड को कम से कम ठीक है, कम से कम #includeConstants.h फ़ाइल केवल एक स्रोत फ़ाइल में है। यदि आप एकाधिक स्रोत फ़ाइलों में हेडर फ़ाइल का उपयोग करते हैं, तो आपके पास कई बार परिभाषित वही चर होंगे। हेडर फाइल में स्थिरांक के सही उपयोग के लिए उन्हें एक हैडर (Constants.h) जो घोषणाओं चर के शामिल में विभाजित करने के लिए कर रहे हैं, और एक स्रोत फ़ाइल (Constants.cpp) जो निर्धारणों वाली चर के:

हेडर फाइल:

#ifndef CONSTANTS_H 
#define CONSTANTS_H 

extern const std::string kAttributeX; 
extern const std::string kAttributeY; 

#endif 

स्रोत फ़ाइल:

const std::string kAttributeX = "x"; 
const std::string kAttributeY = "y"; 
+0

तो, अगर तारों को .cpp फ़ाइल में परिभाषित किया गया है, तो वे वास्तव में तत्काल कब होते हैं? –

+0

@NatWeiss वे सभी अन्य वैश्विक चर के साथ एक साथ तत्काल हो जाएंगे। –

+0

क्या वेरिएबल के साथ समस्या कई बार परिभाषित होती है जब वे "कॉन्स्ट char * const" थे? मुझे यकीन है कि यह नहीं है, लेकिन मुझे समझ में नहीं आता क्यों। क्या "कॉन्स्ट char * const" को एक ही स्थान में परिभाषित करने का विशेषाधिकार देता है जिसमें इसका मूल्य शामिल है (विशेष रूप से रखरखाव के मामले में, बहुत अच्छा, आईएमओ)? – Brent212

2

आपका दूसरा विकल्प va में से प्रत्येक का कारण बनता है प्रत्येक अनुवाद इकाई (सीपीपी फ़ाइल जिसमें हेडर शामिल है) में दंगे बनाए जाएंगे जो कोड आकार को थोड़ा बढ़ाएंगे और साथ ही थोड़ी देर के रनटाइम लागत को जोड़ देंगे (लॉन्च के दौरान उन सभी स्ट्रिंग का निर्माण और प्रक्रिया समाप्ति के दौरान उन्हें नष्ट कर देगा)।

समाधान suggested by Joachim काम करता है लेकिन मुझे एक ड्रैग होने के लिए अलग-अलग चर घोषित करने और परिभाषित करने लगता है। मैं व्यक्तिगत रूप से खुद को दोहराने से नफरत करता हूं, मुझे भी वही बात बार-बार पसंद नहीं है ...

मुझे सी ++ में उचित समाधान के बारे में पता नहीं है लेकिन कंप्यूटर्स मैंने सभी के साथ काम किया है __declspec(selectany) जैसे कुछ का समर्थन करें ताकि आप हेडर फ़ाइल में चर को परिभाषित कर सकें और केवल एक ऑब्जेक्ट को तुरंत चालू कर सकें (प्रत्येक अनुवाद इकाई के लिए एक के बजाय)।

__declspec(selectany) extern const std::string kAttributeX = "x"; 

(क्यों extern और const दोनों को देखने के this answer के लिए)।

आपको अभी भी प्रक्रिया लॉन्च के दौरान सभी वैश्विक चर के प्रारंभिक मूल्य का भुगतान करने की कमी है। यह स्वीकार्य 101% (देता है या 2% लेता है) लेकिन आप आलसी वस्तुओं का उपयोग करके इससे बच सकते हैं (मेरे पास written about something similar here है)।

संबंधित मुद्दे