हाल ही में मैं इतना एक वर्ग जो अलग कार्यक्षमता है कि यह है चाहिए, आदर्श का एक सा ले के उपयोग के बारे में एक प्रश्न पोस्ट। मुझे सिंगलटन पैटर्न के बारे में जानने की अनुशंसा की गई थी ताकि कक्षा का केवल एक उदाहरण बनाया जा सके और यह उस डेटा के चारों ओर घूमने वाले संचालन के सेट को प्रबंधित करता है जो इसे समाहित करता है। आप यहां प्रश्न देख सकते हैं - using Static Container for base and derived classes।नामस्थान का उपयोग कर के बजाय एकमात्र
अब इस कोड पर विचार -
#include <iostream>
#include <string>
#include <unordered_map>
class A{
std::string id;
public:
A(std::string _i): id(_i){}
virtual void doSomething(){std::cout << "DoSomethingBase\n";}
};
class B : public A{
std::string name;
public:
B(std::string _n):name(_n), A(_n){}
void doSomething(){std::cout << "DoSomethingDerived\n";}
};
namespace ListA{
namespace{
std::unordered_map<std::string, A*> list;
}
void init(){
list.clear();
}
void place(std::string _n, A* a){
list[_n] = a;
}
}
int main() {
ListA::init();
ListA::place("b1", new B("b1"));
ListA::place("a1", new A("a1"));
return 0;
}
तथ्य यह है कि मैं अभी भी कच्चे संकेत दिए गए जो स्मृति लीक कर रहे हैं कार्यक्रम के रूप में यह है समाप्त हो जाता है नहीं है का उपयोग कर रहा अनदेखी कर, यह एक अच्छा है वैश्विक स्थैतिक चर, या एक सिंगलटन का उपयोग करने के विकल्प?
पिछले प्रश्न के संबंध में, मैं कक्षा ए (आधार वर्ग) और वर्ग बी (व्युत्पन्न वर्ग) एक namespace है कि इन वस्तुओं की एक सूची का प्रबंधन स्वतंत्र पुनर्गठित किया है। तो क्या यह एक अच्छा विचार है, या एक पूरी तरह से बुरा अभ्यास है? क्या इसके लिए कोई कमी है?
एक अच्छा सिंगलटन कार्यान्वयन मैं सुझाव दिया गया था इस प्रकार थी -
class EmployeeManager
{
public:
static EmployeeManager& getInstance()
{
static EmployeeManager instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
private:
EmployeeManager() {};
std::unordered_map<std::string, Employee&> list;
public:
EmployeeManager(EmployeeManager const&) = delete;
void operator=(const&) = delete;
void place(const std::string &id, Employee &emp){
list[id] = emp;
}
};
class Employee
{
public:
virtual void doSomething() = 0;
};
class Writer : public Employee
{
private:
std::string name_;
public:
Writer(std::string name) : name_(name) {};
void doSomething() { };
};
ईमानदारी से मैं सिंगलटन पैटर्न और मैं दूर शर्मा कर रहा हूँ कभी नहीं आज़माया यह सीधे उपयोग करने के लिए के बाद से मैं कोई पूर्व अनुभव है और मैं पहले इसे अपने पालतू परियोजनाओं में उपयोग करना चाहूंगा।
किसी सिंगलटन पैटर्न की सिफारिश करने के लिए आपकी प्रतिक्रिया की तरह जब तुम सिर्फ कोई है जो आप पोकर के कुछ दौर एक धुएँ के रंग वापस कमरे में और बाद ले रहा है पता चलता है कि "हम इसे दिलचस्प बनाना चाहिए" मिलने चाहिए। –
सिंगलटन पैटर्न उपयोगकर्ता को केवल एक उदाहरण बनाने के लिए * बल * करने का एक तरीका है। क्या आपको वास्तव में केवल एक की आवश्यकता होने पर कई उदाहरण बनाने का आग्रह होता है? यदि नहीं, तो बस अपनी इच्छित वस्तु बनाएं और इसके साथ किया जाए! –
@ बॉपरसन क्या मुझे वास्तव में मेरे उपयोग के मामले के लिए एक वस्तु बनाने की ज़रूरत है? क्या मुझे बस कुछ संबंधित विशेष कार्यों के साथ std :: मानचित्र की आवश्यकता नहीं है? –