बनाम मैं हाल ही में सी ++ जावा और रूबी से वापस आए, और मेरे आश्चर्य करने के लिए बहुत मुझे लगता है कि सार्वजनिक इंटरफ़ेस का उपयोग फ़ाइलों पुन: संयोजित करने के लिए जब मैं एक की विधि हस्ताक्षर बदलने के लिए है निजी विधि, क्योंकि निजी भाग भी .h फ़ाइल में हैं।रखने गुप्तांगों: शुद्ध आभासी आधार वर्ग pimpl
मैं जल्दी से एक समाधान है कि है, मुझे लगता है, एक जावा प्रोग्रामर के लिए विशिष्ट के साथ आया था: इंटरफेस (= शुद्ध आभासी आधार वर्ग)।
BananaTree.h:
class Banana;
class BananaTree
{
public:
virtual Banana* getBanana(std::string const& name) = 0;
static BananaTree* create(std::string const& name);
};
BananaTree.cpp: उदाहरण के लिए
class BananaTreeImpl : public BananaTree
{
private:
string name;
Banana* findBanana(string const& name)
{
return //obtain banana, somehow;
}
public:
BananaTreeImpl(string name)
: name(name)
{}
virtual Banana* getBanana(string const& name)
{
return findBanana(name);
}
};
BananaTree* BananaTree::create(string const& name)
{
return new BananaTreeImpl(name);
}
केवल परेशानी यहाँ, कि मैं new
उपयोग नहीं कर सकते, और बदले BananaTree::create()
कॉल करना होगा है। मुझे नहीं लगता कि यह वास्तव में एक समस्या है, खासकर जब से मैं कारखानों का उपयोग करने की उम्मीद करता हूं वैसे भी।
अब, सी ++ प्रसिद्धि के बुद्धिमान पुरुष, तथापि, एक और समाधान के साथ, pImpl idiom आया था।
BananaTree.h: कि के साथ, अगर मैं इसे सही ढंग से समझ, मेरे कोड कैसा दिखेगा
class BananaTree
{
public:
Banana* addStep(std::string const& name);
private:
struct Impl;
shared_ptr<Impl> pimpl_;
};
BananaTree.cpp:
struct BananaTree::Impl
{
string name;
Banana* findBanana(string const& name)
{
return //obtain banana, somehow;
}
Banana* getBanana(string const& name)
{
return findBanana(name);
}
Impl(string const& name) : name(name) {}
}
BananaTree::BananaTree(string const& name)
: pimpl_(shared_ptr<Impl>(new Impl(name)))
{}
Banana* BananaTree::getBanana(string const& name)
{
return pimpl_->getBanana(name);
}
इसका मतलब यह होगा कि मैं एक डेकोरेटर को लागू करना इस मामले में getBanana
, BananaTree
की प्रत्येक सार्वजनिक विधि के लिए स्टाइल अग्रेषण विधि। यह जटिलता और रखरखाव प्रयास के एक अतिरिक्त स्तर की तरह लगता है जिसे मैं आवश्यकता नहीं करना पसंद करता हूं।
तो, अब प्रश्न के लिए: क्या शुद्ध आभासी कक्षा दृष्टिकोण के साथ गलत क्या है? पीआईएमपीएल दृष्टिकोण इतना बेहतर दस्तावेज क्यों है? क्या मैं कुछ भूल गया?