मुझे बहुत सारे सोर्स कोड दिखाई दे रहे हैं जो C ++ में PImpl मुहावरे का उपयोग कर रहे हैं। मुझे लगता है कि इसका उद्देश्य निजी डेटा / प्रकार / कार्यान्वयन को छिपाना है, इसलिए यह निर्भरता को दूर कर सकता है, और फिर संकलन समय और शीर्षक को कम कर सकता है।
लेकिन C ++ में इंटरफ़ेस / शुद्ध-सार कक्षाएं भी यह क्षमता रखती हैं, उनका उपयोग डेटा / प्रकार / कार्यान्वयन को छिपाने के लिए भी किया जा सकता है। और कॉल करने वाले को केवल ऑब्जेक्ट बनाते समय इंटरफ़ेस को देखने के लिए, हम इंटरफ़ेस के हेडर में फ़ैक्टरी विधि की घोषणा कर सकते हैं।
तुलना है:
लागत :
इंटरफ़ेस तरीका लागत कम है, क्योंकि आपको सार्वजनिक आवरण फ़ंक्शन कार्यान्वयन को दोहराने की आवश्यकता नहीं है
void Bar::doWork() { return m_impl->doWork(); }
, आपको बस इंटरफ़ेस में हस्ताक्षर को परिभाषित करने की आवश्यकता है।अच्छी तरह से समझा :
इंटरफ़ेस तकनीक को हर C ++ डेवलपर द्वारा बेहतर ढंग से समझा जाता है।
प्रदर्शन :
इंटरफ़ेस तरीका प्रदर्शन PImpl मुहावरे से भी बदतर नहीं है, दोनों एक अतिरिक्त मेमोरी एक्सेस। मुझे लगता है कि प्रदर्शन समान है।
निम्नलिखित मेरे प्रश्न को स्पष्ट करने के लिए छद्मकोश है:
// Forward declaration can help you avoid include BarImpl header, and those included in BarImpl header.
class BarImpl;
class Bar
{
public:
// public functions
void doWork();
private:
// You don't need to compile Bar.cpp after changing the implementation in BarImpl.cpp
BarImpl* m_impl;
};
एक ही उद्देश्य इंटरफ़ेस का उपयोग करके लागू किया जा सकता है:
// Bar.h
class IBar
{
public:
virtual ~IBar(){}
// public functions
virtual void doWork() = 0;
};
// to only expose the interface instead of class name to caller
IBar* createObject();
तो PImpl का क्या मतलब है?
Impl
क्लास में नहीं टूटेगाABI
, लेकिन इंटरफ़ेस में सार्वजनिक फ़ंक्शन जोड़ें टूट जाएगाABI
।