2010-08-19 13 views
8

के तरीकों की सूची प्राप्त करें क्या सी ++ कक्षा की प्रत्येक विधि के लिए पॉइंटर्स की सूची (उदा। सरणी) बनाने का कोई तरीका है?कक्षा

.NET ढांचे में Type.GetMethods() की तरह कुछ, लेकिन केवल मानक सी ++ का उपयोग करना।

+7

नहीं जब तक आप इसे हाथ से करते हैं। और यह एक डरावनी चीज की जरूरत है। क्यूं कर? – GManNickG

+0

@Gman: "डरावनी चीज की आवश्यकता" के लिए +1 –

+0

@GManNickG कक्षा के पार्स पेड़ को उत्पन्न करके सी ++ कक्षा के तरीकों की सूची उत्पन्न करना क्यों संभव नहीं होगा? –

उत्तर

6

कोई सामान्य तरीके से यह संभव नहीं है। सी ++ में एक ही मेटाडाटा इंफ्रास्ट्रक्चर नहीं है जो नेट है।

क्या आप हमें एक परिदृश्य प्रदान कर सकते हैं जहां आप इस जानकारी का उपयोग करना चाहते हैं? सी ++

+0

अब तक यह जिज्ञासा से बाहर था।मेरा मतलब है, कल मैं JSON डेटा को संभालने के लिए किसी प्रकार की लाइब्रेरी के बारे में सोच रहा था, लेकिन आज मुझे याद नहीं है कि मैंने इस दृष्टिकोण के बारे में क्यों सोचा-_-। फिर भी सवाल बनी रही, इसलिए मैंने पूछा। –

+1

यह एक अच्छा उदाहरण है कि सिंटैक्स समान दिखने पर भी भाषाएं अलग-अलग हैं। समस्याओं को हल करने की मानसिकता दोनों भाषाओं के बीच पूरी तरह से अलग है। कट्टर "get 'er done" दृष्टिकोण के लिए – tenfour

2

.h फ़ाइल की एक प्रति बनाएं और एक संपादक में इसके साथ हैक करें।

नहीं, स्वचालित रूप से ऐसा करने का कोई तरीका नहीं है।

0

के साथ उपयोग करने के लिए एक बेहतर दृष्टिकोण हो सकता है सी ++ केवल वस्तुओं और वर्गों में कोई मेटा वर्ग नहीं है, इसलिए कोई प्रतिबिंब शामिल नहीं हो सका, इसलिए उत्तर नहीं है।

0

आप typeid का उपयोग कर प्रकार की जानकारी प्राप्त कर सकते हैं लेकिन विधि जानकारी नहीं।

3

कोई रास्ता नहीं है।

असल में, ऑब्जेक्ट कोड स्तर पर भी, एक स्थिर वर्ग सदस्य फ़ंक्शन को स्टैंड-अलोन फ़ंक्शन से अलग नहीं किया जा सकता है, न ही किसी ऑब्जेक्ट को पॉइंटर पास करने वाले स्टैंड-अलोन फ़ंक्शन से क्लास इंस्टेंस फ़ंक्शन।

यदि आप अपने कंपाइलर्स नाम-मैंगलिंग योजना को जानते हैं, और प्री-लिंक्ड ऑब्जेक्ट कोड तक पहुंच है, तो आप इसे डीकोड करने में सक्षम हो सकते हैं, लेकिन यह iffy परिणामों के लिए बहुत काम है।

+1

+1। – tenfour

1

आप वास्तव में इस उन्नत सी ++ प्रोग्रामिंग शैलियों और मुहावरे जेम्स Coplien द्वारा 8 अध्याय करने के लिए, चाहते हैं (शायद लंबे समय के बाद से प्रिंट से बाहर है, लेकिन मैंने सुना है कि नील सस्ते में उसकी प्रतिलिपि बेचने के लिए तैयार हो जाएगा) तो सी ++ में "उदाहरण" के साथ प्रोग्रामिंग को कवर करता है। गलती मत करो, क्षमता मुक्त नहीं आती है, लेकिन यह सी ++ में मेटाक्लास जैसी क्षमताओं को प्रदान/प्रदान कर सकती है।

ऑफहैंड, मुझे अपनी इमारत को उस विशेष क्षमता को याद नहीं है जिसे आप अपनी कक्षाओं में से एक में खोज रहे हैं, लेकिन यह लंबे समय से रहा है क्योंकि मैंने उस पुस्तक को सावधानीपूर्वक पढ़ा है। यह हमेशा संभव है कि यह बिल्कुल नहीं किया जा सका, लेकिन मुझे लगता है कि यह काम करेगा, अगर आप जो खुलासा करते हैं उसकी अन्य सीमाओं के साथ रह सकते हैं।

2

मेरी परियोजना में, मैं कक्षा सदस्यों की घोषणा और परिभाषा के लिए विशेष मैक्रोज़ का उपयोग करता हूं, फिर मुझे कक्षा के सदस्यों की सूची मिल सकती है।

कक्षा घोषणा:

#define DECLARE_MODULE_FUNCTION(function_name) \ 
JsonObject function_name(JsonObject value); 

#define DEFINE_MODULE_FUNCTION(function_name) \ 
static ModuleFunctionAdder<LotteryOddsModule> \ 
__LINE__##function_name(L ## #function_name , &LotteryOddsModule::function_name); \ 
JsonObject LotteryOddsModule::function_name(JsonObject value) 

template< typename T > 
class ModuleFunctionAdder; 

class LotteryOddsModule 
{ 
public: 
    typedef JsonObject (LotteryOddsModule::*ModuleFunction)(JsonObject); 

    JsonValue Invoke(JsonValue json_value); 

    DECLARE_MODULE_FUNCTION(GenerateK1AndK2); 

private: 
    friend class ModuleFunctionAdder<LotteryOddsModule>; 
    static std::map< WString , ModuleFunction > _module_functions; 
}; 

template<> 
class ModuleFunctionAdder<LotteryOddsModule> 
{ 
public: 
    ModuleFunctionAdder(WString func_name , LotteryOddsModule::ModuleFunction func) 
    { 
     LotteryOddsModule::_module_functions[ func_name ] = func; 
    } 
}; 

कक्षा परिभाषा: उदाहरण के लिए

JsonValue LotteryOddsModule::Invoke(JsonValue json_value) 
{ 
    return (this->*_module_functions[ L"GenerateK1AndK2" ]) (json_value.get_obj()); 
} 

DEFINE_MODULE_FUNCTION(GenerateK1AndK2) 
{ 
    //... 
}