2012-08-04 17 views
36

मैं विजुअल स्टूडियो के साथ Qt (जो मैं नया हूं) 4.8.2 का उपयोग कर रहा हूं, और मैंने "संपर्क" नामक बेस क्लास बनाई है। मैं नहीं चाहता कि यह वर्ग क्यूटी-अनन्य हो, इसलिए मेरा इरादा एक और वर्ग "क्यूकॉन्टैक्ट" बनाना था जो "संपर्क", और क्यूओब्जेक्ट का उत्तराधिकारी होगा और सभी क्यूटी-संबंधित व्यवसायों जैसे कि Q_OBJECT मैक्रो के साथ सौदा करेगा आदिगैर-क्यूटी बेस क्लासेस

दुर्भाग्य से जब मैं विरासत में मिला है, निर्माण में विफल रहा है, कह रही:

moc_QContact.cpp(53): error C2039: 'staticMetaObject' : is not a member of 'Contact' 
moc_QContact.cpp(75): error C2039: 'qt_metacast' : is not a member of 'Contact' 
moc_QContact.cpp(80): error C2039: 'qt_metacall' : is not a member of 'Contact' 

मैं वेब पर एक छोटे से शोध किया और पता चला कि आप गैर क्यूटी वर्ग से एक क्यूटी वर्ग प्राप्त नहीं सकता। इसलिए इसे ठीक करने के लिए, "संपर्क" "QObject" का उत्तराधिकारी हो सकता है (मैंने कोशिश की, यह काम किया)। लेकिन ऐसा करने से यह क्यूटी के लिए विशिष्ट होगा जो मेरी समस्या है।

तो मैं जो पूछता हूं वह यह है: आप एक क्यूटी कक्षा के लिए गैर-क्यूटी बेस क्लास कैसे बना सकते हैं?

धन्यवाद।

उत्तर

71

आप अपनी कक्षा QObject से प्राप्त कर सकते हैं और अन्य कक्षाओं से प्राप्त नहीं कर सकते हैं, लेकिन आधार वर्ग सूची में QObject needs to be the first base class

तो यह गलत है:

कि MOC प्रक्रियाओं को सुनिश्चित करने प्रत्येक QObject- मदद करने के लिए:

class QContact: public Contact, public QObject {}; 

आप क्यूटी अध्याय 8.4 के साथ

class QContact: public QObject, public Contact {}; 
+0

इसका मतलब है कि वर्ग के पास क्यूटी परियोजनाओं के बाहर कोई उपयोग नहीं होगा। इसके आसपास कोई रास्ता नहीं है? – MasterMastic

+0

@ केन मुझे समझ में नहीं आता कि इसका क्या अर्थ है। यदि 'संपर्क' के पास 'QObject' के साथ कुछ भी नहीं है, तो इसका" क्यूटी परियोजनाओं के बाहर कोई उपयोग क्यों नहीं होगा "? क्या यह विचार आपके लक्ष्य को पहली जगह संग्रहित नहीं करना था? –

+0

मुझे खेद है, मैं सरल बनाउंगा: मैं "क्यूओब्जेक्ट" से प्राप्त करने के लिए "संपर्क" नहीं चाहता हूं, क्योंकि अगर मैं इसे अन्य परियोजनाओं के लिए उपयोग करना चाहता हूं, तो मेरे पास QObject बेस क्लास फंस जाएगा, और यह एक है गैर-क्यूटी परियोजनाओं के साथ समस्या। – MasterMastic

0

के रूप में यह लिखने के लिए An Introduction To Design Patters in C++ से की जरूरत है प्रोजेक्ट में व्युत्पन्न कक्षा, निम्नलिखित लिखने के लिए कुछ दिशानिर्देश हैं: सी ++ कोड और क्यूमेक प्रोजेक्ट फाइलें:

• प्रत्येक कक्षा परिभाषा अपनी स्वयं की .h फ़ाइल में जाना चाहिए।

• इसका कार्यान्वयन संबंधित .cpp फ़ाइल में जाना चाहिए।

• एकाधिक समावेशन से बचने के लिए हेडर फ़ाइल "लपेटा" होना चाहिए (उदा।, #ifndef के साथ)। • प्रत्येक .cpp फ़ाइल को प्रोजेक्ट फ़ाइल के SOURCES चर में सूचीबद्ध किया जाना चाहिए; अन्यथा इसे संकलित नहीं किया जाएगा।

• प्रत्येक शीर्षलेख फ़ाइल .pro फ़ाइल के HEADERS चर में सूचीबद्ध होना चाहिए। इसके बिना, moc फ़ाइल को प्रीप्रोसेस नहीं करेगा।

• Q_OBJECT मैक्रो प्रत्येक QObject व्युत्पन्न हेडर फ़ाइल की कक्षा परिभाषा के अंदर प्रकट होना चाहिए ताकि moc इसके लिए कोड उत्पन्न करने के बारे में जानता हो।

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