2010-02-04 7 views
5

मेरे पास दो DLLs a.dll और b.dll हैं और प्रत्येक में मेरे पास एक वर्ग AClass और BClass है।
मैं एसीलास और बीसीएलएएस दोनों को एक ही इंटरफेस एबीबीबेस का उत्तराधिकारी और कार्यान्वित करना चाहता हूं जो एक शुद्ध अमूर्त वर्ग है।
प्रत्येक कक्षा में मैंने __declspec (dllimport) और __declspect (dllexport) के लिए # डिफाइन सेट किए हैं। जब मैं संकलित करने के लिए कोशिश कर रहा हूँ मैं इस मिल:शुद्ध बेस क्लास को डीएलएल से निर्यात किया जाना चाहिए?

चेतावनी C4275: गैर dll-इंटरफ़ेस वर्ग 'Aclass' dll इंटरफ़ेस वर्ग के लिए आधार के रूप में इस्तेमाल किया 'AbsBase'

जो मूल रूप से मुझे चाहता है __declspec के रूप में घोषित करने के लिए AbsBase (dllexport)
लेकिन अगर कंपाइलर के पास यह तरीका होगा, तो मुझे एएसबीबेस को a.dll और b.dll दोनों से निर्यात करने की घोषणा करनी होगी।

कक्षा के इंटरफ़ेस को निर्यात करने की आवश्यकता क्यों है?
क्या इसके आसपास कोई रास्ता है? क्या मुझे वास्तव में डीएलएल दोनों से एब्सबेस निर्यात करना चाहिए? क्या इसमें कुछ स्वाभाविक रूप से गलत नहीं है? (मैं एक नया XXX_EXPORT मैक्रो निर्धारित करने की आवश्यकता होगी ..)

+0

क्या आप तीसरा डीएलएल बना सकते हैं? – jmucchiello

+0

हमें अपना इंटरफ़ेस और कक्षा घोषणाएं दिखाएं। –

उत्तर

3

ऐसा लगता है कि यह एक कंपाइलर चेतावनी है और कोई त्रुटि नहीं है, इसलिए इसे अभी भी काम करना चाहिए। कंपाइलर सिर्फ आपको यह बताने के लिए है कि आप ऐसा कुछ कर रहे हैं जो आपके लिए पेंच करना आसान बनाता है। यह तब तक पूरी तरह से स्वीकार्य होना चाहिए जब तक कि डीएलएल और कोर प्रोग्राम दोनों बेस क्लास की परिभाषा पर सहमत न हों।

आप चेतावनी को दबाने के लिए एक pragma उपयोग करने के लिए सक्षम होना चाहिए:

http://forums.devx.com/archive/index.php/t-84785.html

+1

उस धागे में "राल्फ" से प्रतिक्रिया रोशनी है। @ ओपी: आपको उस समस्या का अनुभव नहीं होगा राल्फ का उल्लेख है कि आपकी बेस क्लास शुद्ध सार * हमेशा के लिए * बनी हुई है। –

+0

आधार वर्ग को पूरी तरह से शुद्ध आभासी समस्या को हल करना। – shoosh

0

मैं एक टिप है:

class Base { 
    public: 
    virtual void f() = 0; 
    virtual void g() = 0; 
    virtual ~Base(); 
}; 

class A: public Base { 
    public: 
    virtual void f(); 
    virtual void g(); 
}; 

class B: public Base { 
    public: 
    virtual void g(); // REVERSE ORDER 
    virtual void f(); 
}; 

च और आभासी विधि तालिका में जी के आदेश आधार वर्ग में निर्दिष्ट किया जाता है और इस जानकारी बहुत है जरूरत है।

+0

हां, यह है। यही कारण है कि यह हेडर फ़ाइल में है। –

1

इस बारे में चिंतित होने के लिए कुछ है। कंपाइलर ने पाया है कि बेस क्लास में कोड चलाया जा सकता है। यह एक वर्चुअल विधि शुद्ध नहीं होगा, यह जानता है कि उन्हें फ़िल्टर कैसे करें। शायद एक निर्माता या विनाशक? विफलता मोड यह है कि क्लास कोड का मेमोरी लेआउट क्लाइंट कोड बनाम डीएलएल में समान नहीं हो सकता है। इस कारण रनटाइम मेहेम बहुत निदान करने के लिए कठिन है।

आप ठीक रहेगा जब तक आप गारंटी दे सकते हैं कि क्लाइंट और डीएलएल दोनों सीआरटी और उन उपकरणों के सटीक संस्करणों का उपयोग करके सटीक उसी संकलन और लिंक सेटिंग्स के साथ संकलित किए गए हैं। आप कक्षा के बजाय गैर-मानक __interface कीवर्ड का उपयोग कर बेस क्लास गारंटीकृत सार बना सकते हैं।