2010-09-16 14 views
21

मेरे पास जावा से पुनः लिखे गए सी ++ वर्गों का एक काफी जटिल सेट है। इसलिए प्रत्येक वर्ग में एक विरासत वर्ग होता है, और फिर यह एक या अधिक अमूर्त कक्षाओं (या इंटरफेस) को भी लागू करता है।क्यूटी इंटरफेस या अमूर्त कक्षाएं और qobject_cast()

क्या कक्षा से किसी एक इंटरफेस में कनवर्ट करने के लिए qobject_cast() का उपयोग करना संभव है? अगर मैं QObject से सभी इंटरफेस प्राप्त करता हूं, तो मुझे अस्पष्ट QObject संदर्भों के कारण त्रुटि मिलती है। हालांकि, मेरे पास केवल QObject से प्राप्त बेस क्लास है, मैं qobject_cast() का उपयोग नहीं कर सकता क्योंकि यह QObject एस के साथ संचालित होता है।

मैं अपने इंटरफेस द्वारा संदर्भित प्लगइन्स और डीएलएल के बीच कक्षाओं के चारों ओर फेंकने में सक्षम होना चाहता हूं।

+0

जैसा कि मैं दस्तावेज़ों में और अधिक पढ़ रहा हूं, मुझे यकीन नहीं है कि मैं क्या करना चाहता हूं ... और यह अच्छा नहीं है। मैं आरटीटीआई आधारित .dynamicCast () का उपयोग कर सकता हूं लेकिन ऐसा लगता है कि यह हमेशा डीएलएल सीमाओं में काम नहीं करेगा। –

+0

मुझे यह मिला: http://stackoverflow.com/questions/3201273/qt-moh-multiple-inheritance-problem तो मुझे लगता है कि यह पहले से ही पूछा जा चुका है। –

उत्तर

28

कुछ अनुसंधान और the qobject_cast documentation पढ़ने के बाद, मैंने पाया इस:

qobject_cast() भी इंटरफेस के साथ संयोजन के रूप में इस्तेमाल किया जा सकता; प्लग & विवरण के लिए उदाहरण पेंट देखें।

यहां उदाहरण के लिए लिंक है: Plug & Paint

उदाहरण में interfaces header खोदने के बाद, मुझे Q_DECLARE_INTERFACE मैक्रो मिला जो आपको जो चाहिए वो करने देता है।

पहला, QObject आपके इंटरफेस से प्राप्त नहीं करता है। ,

class YourInterface 
{ 
public: 
    virtual void someAbstractMethod() = 0; 
}; 

Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0") 
फिर अपने वर्ग परिभाषा

Q_INTERFACES मैक्रो का उपयोग, इस तरह:: हर इंटरफेस आप के लिए, इस तरह Q_DECLARE_INTERFACE घोषणा का उपयोग

class YourClass: public QObject, public YourInterface, public OtherInterface 
{ 
    Q_OBJECT 
    Q_INTERFACES(YourInterface OtherInterface) 

public: 
    YourClass(); 

    //... 
}; 

यह सब मुसीबत के बाद, निम्न कोड काम करता है :

YourClass *c = new YourClass(); 
YourInterface *i = qobject_cast<YourInterface*>(c); 
if (i != NULL) 
{ 
    // Yes, c inherits YourInterface 
} 
+0

आह! ठंडा। मैंने Q_DECLARE_INTERFACE को आजमाया था, लेकिन व्युत्पन्न ऑब्जेक्ट में Q_INTERFACES को नहीं जोड़ा था। सहायता के लिए धन्यवाद। –

+0

@ टिमोथी - मुझे खुशी है कि मैं मदद कर सकता हूं। मैं हर दिन क्यूटी के बारे में कुछ नया सीखता हूं। :) – Venemo

+2

आम तौर पर, लोग 'if (yourInterface * i = qobject_cast (c)) {} 'का उपयोग करते हैं। यह सुनिश्चित करता है कि अगर यह अमान्य है तो पॉइंटर का कभी भी उपयोग नहीं किया जाता है। – Puppy

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