के रूप में चिह्नित किया जा सकता है मेरे पास कस्टम दस्तावेज़ का प्रतिनिधित्व करने वाले थ्रेड-सुरक्षित Document
वर्ग है। इसमें इसके राज्य को संशोधित करने के लिए गेटर्स (कॉन्स फ़ंक्शंस) और सेटर्स हैं। इन सभी कार्यों के म्युटेक्स-सुरक्षित दस्तावेज़ की गारंटी करने के बदला नहीं जाएगा, जब तक विधि पूरी तरह से निष्पादित किया जाएगा रहे हैं।म्यूटेक्स-लॉकिंग फ़ंक्शन को
लेकिन कारण QMutex
उपयोग, मैं mutable
उपयोग के बिना const
के रूप में राज्य के पहुँचा समारोह चिह्नित नहीं कर सकते। कैप्चरिंग QMutex
इसे बदलना राज्य है।
क्या यह कोड सही है, या इसे एक और अच्छे तरीके से लिखा जा सकता है? हैकी mutable
उपयोग के बिना।
class Document
{
// This method should be const: it changes only mutex
// and don't touch document state
bool IsCorrect() const;
...
mutable QMutex m_lock;
};
bool Document::IsCorrect() const
{
// Capturing mutex object change it!
QMutexLocker lock(&m_lock);
... Const-aware code
bool result = (m_context != NULL);
...
return result;
}
'म्यूटेबल' का यह उपयोग "हैकी" नहीं है ... यह वही है जो 'उत्परिवर्तनीय' है (लेकिन विशेष रूप से नहीं - उदाहरण के लिए कैशिंग परिणाम, उपकरण समान रूप से वैध उपयोग हैं)। –
'mutable' एक कैश (बाहरी राज्य के आंतरिक प्रतिनिधित्व) कि ताजा जब पढ़ा, एक पढ़ने समारोह स्थिरांक है तो भले ही, कैश बदल सकते हैं हो सकता है हो सकता है, लेकिन इसका मतलब यह नहीं है का एक और उदाहरण है कि राज्य वस्तु बदल गई है। – stefaanv
@TonyD मेरे मुख्य कहते हैं की तरह कुछ "स्थिरांक समारोह कुछ भी बदल रहा है नहीं होना चाहिए - और म्युटेक्स दस्तावेज़ राज्य का एक हिस्सा है, यह परोक्ष बदलते भ्रामक है"। क्या मुझे उसे तार्किक और बिटवाइज स्थिरता के बारे में समझाया जाना चाहिए? – eraxillan