2013-05-11 19 views
6

मैं अभी भी सी ++ के लिए थोड़ा नया हूं, इसलिए मेरी नोबनेस के साथ सहन करें।सी ++ गतिशील रूप से कक्षाएं लोड करें

जो मैं चाहता हूं वह है कि मैं अपने प्रोग्राम के उपयोगकर्ता को अपनी कक्षाएं जोड़ने में सक्षम हो सकूं। मेरे पास एक अमूर्त वर्ग Module है, और मेरे एप्लिकेशन में Module के उप-वर्गों का एक सेट शामिल है।

क्या यह किसी विशेष निर्देशिका को खोजने में सक्षम होना संभव है और गतिशील रूप से Module (उपयोगकर्ता द्वारा जोड़ा गया) के सबक्लास लोड करना संभव है?

जावा में मैं org.reflections API का उपयोग करके इसे प्राप्त कर सकता हूं। मुझे लगता है कि सी ++ समकक्ष डीएलएल का उपयोग कर रहा है। शायद मैं गलत हो सकता हूँ।

अग्रिम धन्यवाद।

+2

हाँ, यह गतिशील जोड़ने shread लाइब्रेरी का उपयोग संभव है। यह कारण का मंच विशिष्ट होगा। आप 'क्यूटी' ([क्यूटी प्लगइन्स] (http://qt-project.org/doc/qt-4.8/plugins-howto.html) या कुछ अन्य प्लगइन सिस्टम का उपयोग करने पर विचार कर सकते हैं। – Lol4t0

उत्तर

5

मेरे ज्ञान के लिए सी ++ संकलन मॉडल में "निर्यात वर्गों" का स्पष्ट, प्रत्यक्ष तरीका नहीं है।

#include "MyModule.h" 

// class MyModule inherits Module 

extern "C" Module * create_module() { return new MyModule; } 
extern "C" void free_module(Module * p) { delete p; } 

अब आप गतिशील कि लाइब्रेरी लोड और कार्यों create_module और free_module प्राप्त कर सकते हैं, और अपने सिस्टम के लिए गतिशील रूप से उनके कार्य संकेत जोड़ें:: हालांकि, अगर आप एक साधारण सी इंटरफेस के साथ यह करने के लिए सक्षम होना चाहिए

std::map<std::string, std::pair<Module * (*)(), void(*)(Module *)> plugins; 

plugins["MyClass"] = std::make_pair(..., ...); // the dynamically resolved 
               // function addresses 

असल में, आपको शायद विनाशक समारोह की भी आवश्यकता नहीं है, क्योंकि साधारण वर्चुअल विनाशक मशीनरी को गतिशील रूप से लोड की गई पुस्तकालयों में भी काम करना चाहिए।

उदाहरण के लिए:

std::unique_ptr<Module> make_module(std::string const & s) 
{ 
    auto it = plugins.find(s); 

    return { it == plugins.end() ? nullptr : it->second.first() }; 
} 
संबंधित मुद्दे