2010-07-08 12 views
10

मेरे क्यूटी आवेदन में, मेरे पास आधार श्रेणी है। मैं QObject का उपयोग कर रहा हूं क्योंकि मैं सभी व्युत्पन्न कक्षाओं में सिग्नल-स्लॉट तंत्र का उपयोग करना चाहता हूं।क्यूटी/सी ++ में एकाधिक विरासत का सही तरीका क्या है?

class IRzPlugin : public QObject { 

public: 
    virtual void registerMenu(QWidget*); 
    virtual void execute(); 
} 

तब मेरे पास एक और वर्ग है। मुझे QWidget से विस्तार करने की आवश्यकता है क्योंकि मुझे सभी व्युत्पन्न कक्षाओं में ईवेंट हैंडलिंग विधियों को लागू करने की आवश्यकता है। (MouseMoveEvent(), keyPressEvent() .. आदि);

class IRzLayeringPlugin : public IRzPlugin , public QWidget{ 

} 

लेकिन संकलक देता है इन त्रुटियों:

C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx: In member function `virtual const QMetaObject* IRzLayeringPlugin::metaObject() const': 
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin' 
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin' 
make[2]: *** [CMakeFiles/Rinzo.dir/plugin/moc_IRzLayeringPlugin.cxx.obj] Error 1 

उत्तर

6

वर्तमान अवतार में, व्युत्पन्न वर्ग (जैसे IRzLayeringPlugin कक्षा) के लिए एकाधिक विरासत पथों में QObject का उपयोग करना संभव नहीं है। मैंने कभी देखा है कि एकमात्र समाधान किसी भी QObject विरासत के बिना इंटरफेस क्लास बनाना था, लेकिन उन कार्यों के साथ जो सीधे QObject फ़ंक्शंस का उपयोग करना चाहते हैं, फिर इंटरफ़ेस और आपके अन्य QObject वर्ग विरासत के बीच पुल को लागू करें कक्षा। यह काफी जल्दी बदसूरत हो जाता है।

+0

धन्यवाद, यही वह है जो मैंने आखिरकार किया / –

3

QObject आधार वर्ग एक बार व्युत्पन्न वर्ग की तुलना में अधिक शामिल हो रही है। समस्या को हल करने के लिए आपको virtual base classes का उपयोग करने की आवश्यकता है।

+3

इस मामले में यह संभव नहीं है क्योंकि 'QWidget' को' QObject' से लगभग प्राप्त करने की आवश्यकता होगी। – Job

6

आज भी इसी तरह का प्रश्न था here

असल में, दो चीजों की जरूरत है:

  • इंटरफ़ेस वर्ग घोषणा

इस के बाद वर्ग के Q_INTERFACES मैक्रो के लिए इंटरफ़ेस जोड़ने के बाद Q_DECLARE_INTERFACE जोड़ना, qobject_cast के साथ काम करेंगे आपके इंटरफेस

यदि आप इंटरफेस से सिग्नल और स्लॉट का उपयोग करना चाहते हैं, तो आप भाग्य से बाहर हैं, क्योंकि आप केवल QObject से प्राप्त प्रकारों के साथ ऐसा कर सकते हैं। लेकिन इस मामले में, आपको हमेशा 'QObject' is an ambiguous base of 'IRzLayeringPlugin' त्रुटि मिल जाएगी।

इस मामले में, @ कालेब का विचार अभी भी सबसे अच्छा है।

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