साझा पुस्तकालयों के साथ एक बहुत ही वास्तविक समस्या है कि pimpl मुहावरा बड़े करीने से शुद्ध करता है कि शुद्ध virtuals नहीं कर सकते हैं: आप अपने कोड को फिर से जमा करने के लिए वर्ग के उपयोगकर्ताओं को मजबूर किए बिना किसी वर्ग के डेटा सदस्यों को सुरक्षित रूप से संशोधित / निकाल नहीं सकते हैं। यह कुछ परिस्थितियों में स्वीकार्य हो सकता है, लेकिन सिस्टम लाइब्रेरी के लिए नहीं।
समस्या को विस्तार से समझाने के लिए, अपने साझा पुस्तकालय / शीर्ष लेख में निम्नलिखित कोड पर विचार करें:
// header
struct A
{
public:
A();
// more public interface, some of which uses the int below
private:
int a;
};
// library
A::A()
: a(0)
{}
संकलक साझा पुस्तकालय में कोड का उत्सर्जन करता है जो पूर्णांक के पते की गणना करता है कि यह एक निश्चित ऑफसेट होने के लिए प्रारंभिक है (शायद इस मामले में शून्य है, क्योंकि यह सूचक से ए ऑब्जेक्ट के लिए एकमात्र ऐसा सदस्य है जो इसे जानता है this
।
कोड के उपयोगकर्ता पक्ष पर, एक new A
पहले आवंटित करेगा sizeof(A)
स्मृति की बाइट्स, तो है कि स्मृति के लिए सूचक हाथ A::A()
के रूप में निर्माता this
।
यदि आपकी लाइब्रेरी के बाद के संशोधन में आप पूर्णांक को छोड़ने का निर्णय लेते हैं, तो इसे बड़ा, छोटा, या सदस्य जोड़ें, स्मृति उपयोगकर्ता के कोड के आबंटन की मात्रा के बीच एक बेमेल होगा, और विधायक कोड की अपेक्षा करता है। संभावित परिणाम एक दुर्घटना है, यदि आप भाग्यशाली हैं - यदि आप कम भाग्यशाली हैं, तो आपका सॉफ़्टवेयर अजीब व्यवहार करता है।
पिंप्लिंग द्वारा, आप आंतरिक कक्षा में डेटा सदस्यों को सुरक्षित रूप से जोड़ और हटा सकते हैं, क्योंकि स्मृति आवंटन और कंस्ट्रक्टर कॉल साझा लाइब्रेरी में होते हैं:
// header
struct A
{
public:
A();
// more public interface, all of which delegates to the impl
private:
void * impl;
};
// library
A::A()
: impl(new A_impl())
{}
अब आपको बस इतना करना है कि आप अपने सार्वजनिक इंटरफ़ेस को संकेतक के अलावा डेटा सदस्यों को कार्यान्वयन ऑब्जेक्ट तक मुक्त रखें, और आप त्रुटियों के इस वर्ग से सुरक्षित हैं।
संपादित करें: मुझे शायद यह जोड़ना चाहिए कि एकमात्र कारण जो मैं यहां कंस्ट्रक्टर के बारे में बात कर रहा हूं वह यह है कि मैं अधिक कोड प्रदान नहीं करना चाहता था - डेटा सदस्यों तक पहुंचने वाले सभी कार्यों पर एक ही तर्क लागू होता है।