2010-05-26 12 views
8

में वेरिएबल का नाम का प्रतिनिधित्व करते हैं शीर्षक स्पष्ट नहीं था स्ट्रिंग का उपयोग मूल्य, मैं स्पष्ट करने के लिए मैं क्या पूछ रहा हूँ की कोशिश करेंगे:पहुँच चर सी ++

कल्पना कीजिए मैं है एक चर काउंटर कहा जाता है, मैं जानता हूँ कि मैं अपने को देख सकते हैं की तरह कुछ कर रही द्वारा वर्तमान मूल्य:

std::cout << counter << std::endl; 

हालांकि, मैं चर के बहुत सारे है मान लेते हैं और मैं नहीं जानता कि जो मैं क्रम में जब तक देखना चाहते करने जा रहा हूँ।

किसी को भी एक तरह से पता है मैं उदाहरण के लिए अपने नाम का उपयोग कर, द्वारा एक चर के मूल्य लाने के कर सकते हैं:

std::cout << valueOf("counter") << std::endl; 

मुझे क्या करना इस बड़े जटिल परियोजनाओं को आसान बना सकता है डिबगिंग सक्षम किया जा रहा है।

आपके समय के लिए अग्रिम धन्यवाद।


अद्यतन: सभी प्रदान की जवाब वैध और उपयोगी होते हैं, फिर भी मुख्य मुद्दा यह है कि प्रतिबिंब सी में मौजूद नहीं है ++ (और लिंक को पढ़ने के बाद सिफारिश की यह स्पष्ट क्यों है)।

+0

क्या 'काउंटर' स्ट्रिंग * संकलन-समय * में ज्ञात है? – kennytm

+6

इसे "डीबगर" कहा जाता है - यह आपको अन्य उपयोगी सुविधाओं के बीच रनटाइम के दौरान परिवर्तनीय मानों की जांच करने की अनुमति देता है :) – Drakosha

+0

मुझे डिबगर्स और डिबगिंग के बारे में अच्छी तरह से पता है, अन्य उत्तरों ने पहचाना है कि मैं प्रतिबिंब के बारे में पूछ रहा था - एक शब्द जिसे मैं पहले अनजान था का ... –

उत्तर

10

जैसा कि उल्लेख किया गया है, आप सी ++ में प्रतिबिंब की तलाश में हैं। इसमें यह नहीं है, और this answer क्यों बताता है।

0

इसे प्रतिबिंब या eval के समान कुछ चाहिए जो C++ के पास नहीं है।

0

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

चूंकि मैं अपने सिर के शीर्ष का कोई अच्छा कारण नहीं सोच सकता क्योंकि यह उपयोगी होगा, शायद आप हमें प्रबुद्ध कर सकते हैं। जब किसी निश्चित तरीके से कुछ नहीं किया जा सकता है, तो आधार आवश्यकताओं पर वापस कदम उठाना और यह देखना अच्छा होता है कि कोई दूसरा तरीका है या नहीं।

+0

जेनेरिक एल्गोरिदम डीबग करते समय यह बेहद उपयोगी है। जब एक सामान्य एल्गोरिदम में कुछ विफल रहता है, तो वास्तविक प्रकार का नाम वास्तव में मदद करता है। अक्सर बार, डिबगर्स इसे प्रदर्शित नहीं करते हैं। –

4

आप एक एसडीडी :: मानचित्र < std :: string, your_variable_type> एक चर को एक चर से जोड़ने के लिए एक एसोसिएटिव कंटेनर का उपयोग कर सकते हैं, मानते हैं कि वे सभी एक ही प्रकार के हैं।

आप विभिन्न प्रकार के चर है, समाधान मौजूद है, को बढ़ावा देने :: संस्करण में के रूप में तो

1

सी ++ पते के माध्यम से सभी चर को संबोधित करते तो वहाँ सिर्फ valueOf एक चर (बोली जो इस जैसे अजगर की अनुमति देने के कहने का कोई रास्ता नहीं है, perl में इस जानकारी को रखने के लिए रनटाइम है)

आप किसी नाम का उपयोग std :: map में मानों और उनके नामों को संग्रहीत करके मूल्य खोजने के लिए कुछ नाम लागू कर सकते हैं।

1

ठीक है अगर आप वास्तव में ऐसा कुछ करना चाहते हैं, तो आप std :: map (मानचित्र < स्ट्रिंग, int *>) का उपयोग करने का प्रयास कर सकते हैं। होवर यह आपको एक परिवर्तनीय प्रकार तक सीमित कर देगा, जब तक आप कुछ बदसूरत पॉइंटर जादू में नहीं पहुंच जाते। किसी भी तरह से यह बदसूरत होगा और मेरा विश्वास करो आप वास्तव में इस पथ को नीचे नहीं जाना चाहते हैं। आपको ऐसी सुविधा की आवश्यकता क्यों है? यदि डीबगिंग उद्देश्यों के लिए, डीबगर का उपयोग करें।

3

नहीं, सी ++ या इसकी मानक लाइब्रेरी के साथ नहीं। बेशक, आप इस व्यवहार को अनुकरण करने के लिए कुछ हैक कर सकते हैं। सी ++ आपको पॉलिमॉर्फिज्म का उपयोग करके रनटाइम पर विधियों को चुनने की अनुमति देता है, ताकि आप इसका लाभ उठा सकें।संक्षेप में, आप बल्कि चर से कार्यावधि में आह्वान करने के लिए, विधि मिल जाएगा, और विधि vlaue वापस आ जाएगी: वैकल्पिक रूप से

struct Value { 
    virtual ~Value(); 
    virtual std::string value() const = 0; 
}; 

struct Counter : public Value { 
    int v; 
    std::string value() const { 
     istringstream ss(v); 
     return ss.str(); 
    } 
}; 

struct Mounter : public Value { 
    double v; 
    std::string value() const { 
     istringstream ss(v); 
     return ss.str(); 
    } 
}; 

Value* get_value(); 

// ... 
cout << get_value()->value() << endl; 

, आप एक नक्शा तारों पर keyed, के नाम बनाए रख सकते हैं मान, और फिर उनके नामों के साथ मूल्यों को देखो।

1

जैसा कि पहले से कहा गया है, सी ++ कोई प्रतिबिंब प्रदान नहीं करता है। लेकिन आप अपने आप पर कुछ कुंजी/मूल्य मैपिंग का उपयोग कर सकते हैं। जब केवल एक मान प्रकार (उदा। Int) आवश्यक है, तो आप बॉक्स के बाहर एक एसटीएल सहयोगी कंटेनर (मानचित्र) का उपयोग कर सकते हैं। यदि आपको एकाधिक मान प्रकारों का समर्थन करने की आवश्यकता है, तो मैं Variant लाइब्रेरी को बढ़ावा देने की अनुशंसा करता हूं।

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