मुझे C ++ 11 में कक्षा सदस्यों के रूप में स्मार्ट पॉइंटर्स के उपयोग को समझने में परेशानी हो रही है। मैंने स्मार्ट पॉइंटर्स के बारे में बहुत कुछ पढ़ा है और मुझे लगता है कि मुझे समझ में नहीं आता कि कैसे unique_ptrऔर सामान्य रूप से काम करता shared_ptr/ weak_ptrकरती हूं । जो मुझे समझ नहीं आ रहा है वह वास्तविक उपयोग है। ऐसा लगता है जैसे हर कोई unique_ptrलगभग हर समय जाने के तरीके के रूप में उपयोग करने की सलाह देता है । लेकिन मैं इस तरह से कुछ कैसे लागू करूंगा:
class Device {
};
class Settings {
Device *device;
public:
Settings(Device *device) {
this->device = device;
}
Device *getDevice() {
return device;
}
};
int main() {
Device *device = new Device();
Settings settings(device);
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
मान लीजिए कि मैं बिंदुओं को स्मार्ट पॉइंटर्स के साथ बदलना चाहूंगा। A unique_ptrकाम नहीं करेगा क्योंकि getDevice(), ठीक है? तो वह समय है जब मैं उपयोग करता हूं shared_ptrऔर weak_ptr? उपयोग करने का कोई तरीका नहीं unique_ptr? मुझे लगता है कि ज्यादातर मामलों के लिए मुझे लगता shared_ptrहै जब तक मैं एक बहुत छोटे दायरे में एक सूचक का उपयोग कर रहा हूँ अधिक समझ में आता है?
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> device) {
this->device = device;
}
std::weak_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device(new Device());
Settings settings(device);
// ...
std::weak_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
क्या वह रास्ता है? बहुत बहुत धन्यवाद!
shared_ptr8/10 मामलों में ए सही है। अन्य 2/10 unique_ptrऔर के बीच विभाजित हैं weak_ptr। इसके अलावा, weak_ptrआम तौर पर परिपत्र संदर्भों को तोड़ने के लिए उपयोग किया जाता है; मुझे यकीन नहीं है कि आपका उपयोग सही माना जाएगा।
deviceडेटा सदस्य के लिए क्या स्वामित्व चाहते हैं ? आपको सबसे पहले यह तय करना होगा।
unique_ptrइसके बजाय उपयोग कर सकता हूं और कंस्ट्रक्टर को कॉल करते समय स्वामित्व दे सकता हूं , अगर मुझे पता है कि मुझे अब इसके लिए आवश्यकता नहीं होगी। लेकिन Settingsकक्षा के डिजाइनर के रूप में मुझे नहीं पता कि क्या कॉलर एक संदर्भ भी रखना चाहता है। हो सकता है कि डिवाइस का उपयोग कई स्थानों पर किया जाएगा। ठीक है, शायद यही आपकी बात है। उस स्थिति में, मैं एकमात्र स्वामी नहीं रहूंगा और जब मैं share_ptr का उपयोग करूंगा, तो मुझे लगता है। और: इसलिए स्मार्ट पॉइंट पॉइंटर्स को रिप्लेस करते हैं, लेकिन रेफरेंस नहीं?
deviceकंस्ट्रक्टर के पास होने के बादsettings, क्या आप अभी भी कॉलिंग स्कोप में इसका उल्लेख कर सकते हैं या केवल इसके माध्यम सेsettings? यदि उत्तरार्द्ध,unique_ptrउपयोगी है। इसके अलावा, क्या आपके पास एक परिदृश्य है जहां रिटर्न का मूल्यgetDevice()हैnull। यदि नहीं, तो एक संदर्भ वापस करें।