2012-02-29 10 views
5

यह वास्तव में क्यूटी में एक बग जैसा लगता है। किसी के पास कोई समाधान है या क्या मुझे इसे एक बग के रूप में फाइल करना चाहिए?कक्षा 'QReadWriteLock'Error त्रुटि C2248 में घोषित निजी सदस्य तक नहीं पहुंच सकता:' QReadWriteLock :: QReadWriteLock '

Error 1 error C2248: 'QReadWriteLock::QReadWriteLock' : cannot access private member declared in class 'QReadWriteLock'

कोई फर्क नहीं पड़ता अगर यह निजी/सार्वजनिक है या क्या वर्गों मैं में शामिल हैं:

#include <QReadWriteLock> 

class FileInfoWrapper { 

public: 
    explicit FileInfoWrapper(const QFileInfo& _fileInfo); 
    ~FileInfoWrapper(); 

private: // also tried public 
    mutable QReadWriteLock lock_; 

भी यह प्रयोग करने से पहले, मैं त्रुटि मिलती है। मैं इसे ढेर पर बनाने में सक्षम नहीं प्रतीत होता। इसके बजाय मैं का उपयोग कर 'नए' ढेर तैयार किया, लेकिन जब मैं के साथ निर्माता में इसे हटाने के लिए अपने आवेदन दुर्घटनाओं का प्रयास करें:

Unhandled exception at 0x5090f39a (QtCored4.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfeeeff0e.

कॉल स्टैक:

QtCored4.dll!QHash::~QHash() Line 283 + 0xa bytes C++ QtCored4.dll!QReadWriteLockPrivate::~QReadWriteLockPrivate() + 0x38 bytes C++ QtCored4.dll!QReadWriteLockPrivate::`scalar deleting destructor'() + 0xf bytes C++ QtCored4.dll!QReadWriteLock::~QReadWriteLock() Line 137 + 0x1e bytes C++ CloudSync.exe!FileInfoWrapper::~FileInfoWrapper() Line 76 + 0x15 bytes C++

चर 'प' में QReadWriteLockPrivate दो बार हटा दिया प्रतीत होता है। हालांकि, यह एक और कक्षा में काम करता है जहां मुझे ढेर पर ताला बनाना था और फिर इसे कन्स्ट्रक्टर में हटा देना था।

विजुअल स्टूडियो में क्यूटी 4.8.0 चल रहा है। क्यूटी निर्माता 4.7.4 में एक ही मुद्दा था।

+0

क्यूटी 4.7.4, MinGW, विंडोज 7 x64 के साथ पुन: पेश करने में असमर्थ। –

उत्तर

6

आप क्योंकि QReadWriteLock copyable नहीं है (यह Q_DISABLE_COPY उपयोग करता है) एक सूचक का उपयोग करना होगा और आप किसी भी तरह अपने FileInfoWrapper वस्तुओं कॉपी कर रहे हैं (उनमें उदाहरण के लिए एक कंटेनर में भंडारण के द्वारा)।
तो पॉइंटर पता उन प्रतियों के बीच साझा किया जाता है, और प्रत्येक प्रतिलिपि के लिए एक बार हटा दिया जाता है।

आप पॉइंटर को एक स्मार्ट पॉइंटर के अंदर लपेट सकते हैं, ताकि हटाना केवल तभी होगा जब आपकी ऑब्जेक्ट की अंतिम प्रति हटा दी जाए।

QSharedPointer<QReadWriteLock> lock_; 
+0

इसलिए फ़ाइल में इसे हटाने की कोई आवश्यकता नहीं हैप्रैपर कन्स्ट्रक्टर? और हाँ, मेरे पास इन फ़ाइलों की एक सूची है, लेकिन मैं अभी भी नहीं गिरता। क्या मैं सिद्धांत में केवल एक लॉक रखूंगा कि सभी ऑब्जेक्ट्स साझा करते हैं? और यदि मेरे पास एक कक्षा है जिसमें मेरे पास केवल एक होगा और इसे स्टैक पर घोषित करना चाहते हैं, तो क्या मैं अपनी कक्षा में Q_DISABLE_COPY मैक्रो का उपयोग कर सकता हूं? – chikuba

+0

** 1। ** हां, आपको इसे विनाशक में स्पष्ट रूप से हटाने की आवश्यकता नहीं होगी। ** 2। ** यदि आप स्क्रैच से 2 'FileInfoWrapper' ऑब्जेक्ट्स बनाते हैं (हालांकि आपका कन्स्ट्रक्टर QFileInfo' लेता है), तो 2 स्वतंत्र ताले होंगे। ** 3। ** यदि आपका मतलब है कि पूरे एप्लिकेशन के लिए कक्षा के केवल एक उदाहरण की अनुमति है, तो आपको इसके बजाय "सिंगलटन पैटर्न" आज़माएं। – alexisdm

+0

मैंने कभी भी FileInfoWrapper की प्रतिलिपि नहीं बनाई है, बस ऑब्जेक्ट के बहुत सारे उदाहरण हैं। लेकिन क्या आपका मतलब है कि मेरे पास सूची के बाहर एक वस्तु है? – chikuba

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