/ / एक एकल वर्ग का विस्तार करना, जिसमें निजी कंस्ट्रक्टर है और विध्वंसक संकलन समय की चेतावनी देता है - सी ++, डिजाइन-पैटर्न, विरासत, सिंगलटन, विस्तार

एक सिंगलटन क्लास का विस्तार करना जिसमें निजी कन्स्ट्रक्टर और विनाशक संकलन समय चेतावनी देता है - सी ++, डिज़ाइन-पैटर्न, विरासत, सिंगलटन, विस्तार

मैं C ++ (Qt) का उपयोग कर रहा हूं।

मैं एक एकल वर्ग और एक उपवर्ग का विस्तार कर रहा हूंकेवल स्थैतिक विधियाँ हैं। मैं SubClass का कोई उदाहरण नहीं बना रहा हूं। सिंगलटन वर्ग के पास कंस्ट्रक्टर है और विध्वंसक निजी हैं, इसलिए मैं इसके निर्माता और विध्वंसक तक नहीं पहुंच सकता।

 class Singleton
{
private :
Singleton();
~Singleton();
public :
// some methods.
}

class SubClass : public Singleton
{
// There is NO constructor or destructor
public:
// Only some STATIC methods.
}

मैंने उपयोग किया उपवर्ग :: getInstance () जो माता-पिता का getInstance () कॉल करता है। मैं सबक्लास के केवल स्थैतिक तरीकों का उपयोग करता हूं (इसलिए सबक्लास को तत्काल करने की कोई आवश्यकता नहीं है)।

तो मेरी समस्या यह है, मुझे संकलन पर चेतावनी मिल रही है -

"सबक्लास: विध्वंसक उत्पन्न नहीं किया जा सका क्योंकि एक बेस क्लास विध्वंसक दुर्गम है"।

मैं इन चेतावनियों से छुटकारा पाना चाहता हूं और यह भी जानना चाहता था कि क्या यह डिज़ाइन सिंगलटन डिज़ाइन पैटर्न का उल्लंघन कर रहा है?


मैं क्या पाना चाहता हूँ?

मैं एक आवेदन के लिए एक लकड़हारा बना रहा हूं। मैं थर्ड पार्टी लाइब्रेरी (QxtLogger of QxtCore लाइब्रेरी) के एक लकड़हारे वर्ग का उपयोग कर रहा हूं। यह QxtLogger क्लास एक सिंगलटन है और इसमें कंस्ट्रक्टर और डिस्ट्रक्टर प्राइवेट हैं। मैं सभी विधियों के साथ एक सिंगलटन वर्ग चाहता हूं जो कि QxtLogger के पास है और कुछ अतिरिक्त स्थिर विधियां (जो मेरे आवेदन के लिए विशिष्ट हैं)।

इसलिए मैंने एक वर्ग बनाया जो QxtLogger को विरासत में मिलाऔर इसमें कुछ स्थिर विधियाँ जोड़ी गईं। मुझे चिंता क्या है कि एकल वर्ग का विस्तार किया जा रहा है जो चेतावनी उत्पन्न कर रहा है (क्योंकि बेस क्लास कंस्ट्रक्टर और विध्वंसक सुलभ नहीं हैं)। तो मुझे क्या करना चाहिए?

उत्तर:

उत्तर № 1 के लिए 4

आप "उस वर्ग का विस्तार कर सकते हैं जिसके पास कोई दृश्यमान निर्माता नहीं हैं। और वह वर्ग डिजाइनर का इरादा था।

अगर वे चाहते थे कि वर्ग को बढ़ाया जाए, तो उन्होंने "विधायक / विध्वंसक बना दिया।" protected.

मेरा सुझाव है कि आप विरासत के बजाय रचना का उपयोग करें।


जवाब के लिए 2 № 2

रुकें!

सिंगलटन विरोधी पैटर्न के संदिग्ध उपयोग (एक बार फिर) के अलावा, आपको याद रखना चाहिए कि C ++ जावा नहीं है।

परिणाम के रूप में, वहाँ हैं बेहतर तरीके जो एक वर्ग की कार्यक्षमता का विस्तार करने के लिए विरासत: मुक्त-कार्य!

void extend1(Singleton& s, ...);

int extend2(Singleton const& s);

ध्यान दें कि वे कार्य एक लेते हैं Singleton 2 कारणों से संदर्भ द्वारा वर्ग:

  • यह स्पष्ट हो जाता है कि वे इस पर निर्भर हैं
  • जब आप सिंगलटन से छुटकारा पा लेंगे, तो यह सड़क को फिर से भरने की ओर ले जाता है