2010-05-18 15 views
5

मुझे पता है कि क्यूब्जेक्ट्स को पहचान नहीं माना जाता है जैसे कि आप उन्हें कॉपी नहीं कर सकते हैं और डिफ़ॉल्ट रूप से कॉपी कन्स्ट्रक्टर और असाइनमेंट को क्यूटी दस्तावेज में समझाया गया है। लेकिन क्लोन विधि का उपयोग कर मौजूदा मौजूदा से नया QObject बनाना संभव है? क्या यह एक तर्क त्रुटि होगी? अगर मैं कहता हूँक्यूओब्जेक्ट क्लोनिंग

QObject b; 
QObject a; 
b.cloneFrom(a); 

या

QObject a = new QOBject(); 
QObject b = new QOBject(); 
b->cloneFrom(a); 

और सदस्यों आदि की तरह क्लोन विधि प्रतियां सामान यह गलत हो सकता है?

और यदि यह ठीक है तो क्या मैं अपनी प्रतिलिपि कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर लिख सकता हूं जो बस यही करता है?

नोट: मैं वास्तव में उन वर्गों के साथ प्रयास करना चाहता हूं जो qobject प्राप्त करते हैं।

+0

यह कनेक्शन कनेक्शन को क्लोन भी करेगा? आईएमएचओ, आपके कोड में कुछ गड़बड़ है ... क्या आप इसे पीओडी structs के साथ फिर से कर सकते हैं? – elcuco

+0

कोई कन्फेक्शन को ऑब्जेक्ट में सेट किए गए डेटा सदस्यों (मुख्य रूप से विरासत परत द्वारा जोड़े गए) को क्लोन करने की आवश्यकता नहीं है। – Olorin

उत्तर

7
मेरी राय QObjects क्लोनिंग में

लगभग हमेशा शब्दार्थ टूट गया है और अवांछित दुष्प्रभाव की ओर जाता है , जैसा कि आपने पहले ही कहा है, उनके पास "पहचान" होने के कारण। इसलिए, क्लोनिंग QObjects के बारे में सभी धारणाओं को तोड़ती है, जैसे उनके सिग्नल/स्लॉट कनेक्शन और गतिशील गुण। आपको यह समझना चाहिए कि क्लोन करने के लिए वस्तुओं को वास्तव में QObjects होने की आवश्यकता है, या यदि "मूल्य-भाग" जिसे आप क्लोन करना चाहते हैं, तो उसे बाहर निकाला जा सकता है।

और यदि बिलकुल भी, क्लोनिंग QObjects के अपने विशिष्ट उप-वर्गों के लिए केवल समझ में आता है, न कि QObjects के लिए (जो कि वास्तविक "मूल्य-जैसी" गुण नहीं है)।

भी, ए; बी; एक्लोन फ्रॉम (बी) टूटा हुआ दिखता है, क्योंकि यह बी काम करने के बजाय बी के उप-वर्ग का उदाहरण होने पर काम नहीं करता है। क्लोन वर्चुअल बी * बी :: क्लोन() कॉन्स के माध्यम से किया जाना चाहिए जो मैं कहूंगा।

+3

मुझे यह जोड़ना है कि ऐसा करने से पहले दो बार सोचने के बजाय सब कुछ एक QObject बनाने के लिए एक सामान्य डिज़ाइन गलती है। मैं केवल जहां आवश्यक हो QObjects बनाते हैं, यानी जहां "पहचान" पैटर्न लागू होता है और मुझे सिग्नल/स्लॉट इत्यादि की आवश्यकता होती है –

+0

फ्रैंक के साथ पूरी तरह से सहमत हैं। यहां तक ​​कि क्यूटी में भी कई कक्षाएं शामिल हैं जो QObject से नहीं ली गई हैं। QString, QList, QDomNode जैसे सभी मूल्य कंटेनर ... वे QObject से व्युत्पन्न नहीं हैं। – VestniK

+0

मेरा बुरा जब मैंने कोड लिखा था तो मैंने क्यूओब्जेक्ट को एक उदाहरण के रूप में दिया था, वर्र्स वास्तव में qobject प्रकार के नहीं हैं, लेकिन व्युत्पन्न प्रकार के कोड को MyClass a, b; b.cloneFrom (a) होना चाहिए; लेकिन मुझे लगता है कि मैं qobject से व्युत्पन्न कक्षा का उपयोग करने पर विचार करूंगा – Olorin

4

मुझे लगता है कि इस मामले में क्लास बनाने के लिए सबसे अच्छा अभ्यास QObjects के बीच कॉपी करना चाहते हैं। इस वर्ग को QObject या QObject से व्युत्पन्न किसी भी वर्ग से नहीं लिया जाना चाहिए। और यह वर्ग "मूल्य कंटेनर" होगा। इस मामले में आप वास्तव में अच्छी तरह से अपनी समस्या को हल करने में सक्षम होना चाहिए।

एक और टिप: इस वर्ग के लिए आप अंतर्निहित डेटा साझा प्रति के साथ लिखने पर उपयोग कर सकते हैं अनावश्यक नकल की भूमि के ऊपर कम करने के लिए: http://doc.qt.io/qt-5/implicit-sharing.html

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