2009-03-13 13 views
10

मैं एक गेम पर काम कर रहा हूं और एक दिलचस्प सवाल है। मेरे पास कुछ गेम-व्यापी स्थिर मान हैं जिन्हें मैं एक फ़ाइल में कार्यान्वित करना चाहता हूं।सी ++ क्रॉस-फाइल स्थिरांक को परिभाषित करने का सबसे अच्छा तरीका

constants.cpp

extern const int BEGINNING_HEALTH = 10; 
extern const int BEGINNING_MANA = 5; 

constants.hpp

extern const int BEGINNING_HEALTH; 
extern const int BEGINNING_MANA; 

और फिर फाइल सिर्फ #include "constants.hpp" यह महान काम कर रहा था, जब तक: अभी मैं इस तरह कुछ है मुझे एक स्थिरांक को टेम्पलेट पैरामीटर के रूप में उपयोग करने की आवश्यकता थी, क्योंकि बाहरी रूप से जुड़े स्थिरांक वैध टेम्पलेट पैरामीटर नहीं हैं। तो मेरा सवाल यह है कि इन स्थिरांक को लागू करने का सबसे अच्छा तरीका क्या है? मुझे डर है कि केवल हेडर फ़ाइल में स्थिरांक डालने से उन्हें प्रत्येक अनुवाद इकाई में परिभाषित किया जाएगा। और मैं मैक्रोज़ का उपयोग नहीं करना चाहता।

धन्यवाद

उत्तर

19

extern से छुटकारा और आप तैयार हैं।

इस कोड को एक शीर्षक में पूरी तरह से ठीक काम करता है, क्योंकि सब कुछ "सही मायने में निरंतर" है और इसलिए आंतरिक संबंध है:

const int BEGINNING_HEALTH = 10; 
const int BEGINNING_MANA = 5; 
const char BEGINNING_NAME[] = "Fred"; 
const char *const BEGINNING_NAME2 = "Barney"; 

इस कोड को सुरक्षित रूप से एक हेडर फाइल में नहीं रखा जा सकता क्योंकि प्रत्येक पंक्ति बाहरी लिंकेज (है या तो स्पष्ट या सही मायने में निरंतर नहीं किया जा रहा) की वजह से:

extern const int BEGINNING_HEALTH = 10; 
extern const int BEGINNING_MANA = 5; 
const char *BEGINNING_NAME = "Wilma"; // the characters are const, but the pointer isn't 
+0

मुझे पिछले BEGINNING_NAME [] में एक कॉपी/पेस्ट बग पर संदेह है। क्या आप इसे BEGINNING_NAME के ​​रूप में लिखना चाहते थे? –

+0

आप सही, तय हैं। धन्यवाद। – Tom

+0

आपको "स्थैतिक" की आवश्यकता है, अन्यथा आपको आंतरिक लिंकेज या अधिक आदर्श रूप से, "# परिभाषित" के समतुल्य मानों के साथ समतुल्य नहीं मिलता है। –

10

कैसे enums के बारे में?

constants.hpp

enum { 
    BEGINNING_HEALTH = 10, 
    BEGINNING_MANA = 5 
    } 
-2

शायद एक स्थिर वर्ग की तर्ज पर कुछ?

class CONSTANTS { 
public: 
static inline int getMana() { return 10;}; 
}; 
+0

इससे मदद नहीं मिलती है। फ़ंक्शन मानों को टेम्पलेट पैरामीटर के रूप में उपयोग नहीं किया जा सकता है। सी ++ 0x कीवर्ड 'constexpr' को इसके आसपास काम करना चाहिए। इसके अलावा, सी ++ में नामस्थान हैं, जो "नेमस्पेसिंग" स्थिरांक के लिए एक स्थिर वर्ग के लिए सुपरियोयर हैं। – Tom

+0

* बेहतर * ... मुझे बुनियादी प्रूफरीडिंग कौशल की कमी है :) – Tom

0

सबसे compilers बस स्थिरांक पॉड मूल्यों के लिए अंतरिक्ष का आवंटन नहीं है। वे उन्हें अनुकूलित करते हैं और उनका इलाज करते हैं जैसे कि वे #define डी थे, है ना?

+0

के लिए कोई आवश्यकता नहीं है, लेकिन अभी भी वही नहीं है। उदाहरण जहां मैक्रोज़ काम करते हैं लेकिन स्थिरांक नहीं करते हैं: # खाद्य "foo" परिभाषित करें; \ const char * str = "bar" FOO; सी और सी ++ स्ट्रिंग शाब्दिक टोकन की संगतता की अनुमति देता है, लेकिन स्ट्रिंग स्थिरांक नहीं। – Tom

+0

यह अभिन्न स्थिरांक के लिए केवल सत्य है। ऑप्टिमाइज़ेशन अक्षम होने पर फ़्लोट्स, युगल, चार * और अन्य प्रकारों को स्टोरेज आवंटित किया जाएगा। –

+0

@ टॉम: मेरा मतलब यह नहीं था। मेरा मतलब पीओडी स्थिरांक था, प्रीप्रोसेसर मैजिक्स नहीं। मेरा मतलब यह था कि जब तक आप अपना पता नहीं ले लेते हैं तब तक मूल्य के लिए प्रतीक और स्थान मौजूद नहीं होता है। – greyfade

-5

शीर्षक प्रश्न के त्वरित उत्तर के रूप में, एक सिंगलटन पैटर्न क्रॉस-फ़ाइल स्थिरांक को परिभाषित करने और ऑब्जेक्ट का केवल एक उदाहरण बीमा करने के लिए एक संभव सर्वोत्तम, सी ++ तरीका है।

जहां तक ​​टेम्पलेट पैरामीटर समस्या है, आपको किसी प्रकार को मान नहीं देना होगा। आपका प्रकार "int" है।

+0

यह सरल स्थिरांक के सेट के लिए ओवरकिल की तरह लगता है, और टेम्पलेट त्वरण के साथ अपनी समस्याओं को हल करने की संभावना नहीं है। – Eclipse

+0

टेम्पलेट तत्कालता के साथ अपनी समस्या का समाधान क्यों नहीं करेगा, क्योंकि यह एक बाहरी नहीं होगा, यह एक स्थानीय होगा। ओवरकिल सापेक्ष है, गुणवत्ता परिप्रेक्ष्य $ 100M, $ 100K, या $ 100 गेम बजट क्या है? – jeffD

+0

जेएफडी, समस्या यह है कि आपका उत्तर समझ में नहीं आता है। क्या आप एक "int" एक सिंगलटन बनाना चाहते हैं? एक int मूल्य द्वारा शामिल है, पहचान से नहीं। एक और चीज जो शायद लोगों को आपको कम कर देती है वह यह है कि वह एक प्रकार को पास नहीं करना चाहता, बल्कि उसके टेम्पलेट के लिए एक मूल्य है। तुम क्यों कहते हो वह नहीं कर सकता? –

6

अपनी .hpp फ़ाइल में "स्थिर कॉन्स int" का उपयोग करें, और .cpp फ़ाइल में कुछ भी नहीं डालें (आपके पास जो भी अन्य कोड है, उसे छोड़कर)।

0

क्या कभी एक सरल हुआ:

#define BEGINNING_HEALTH 10 

यार, उन दिनों थे।
ओह प्रतीक्षा करें, उन अभी भी दिन हैं! नामस्थान के

+0

ऐसा नहीं हो सकता है कि आप टेम्पलेट पैरामीटर के संदर्भ में क्या उम्मीद कर रहे हैं ... :) rlbond की आवश्यकता है। –

+4

हम में से कुछ '10' के बजाय 'BEGINNING_HEALTH' दिखाने के लिए हमारे डिबगर्स पसंद करते हैं। –

+0

जब आपके पास printf() है तो डिबगर्स की आवश्यकता होती है? slacy

3

मेकअप उपयोग:

namespace GameBeginning { 
    const int HEALTH = 10; 
    const int MANA = 5; 
}; 

तो यू खिलाड़ी के रूप में उपयोग कर सकते हैं।स्वास्थ्य = गेमबिनिंग :: स्वास्थ्य;