मुझे 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_ptr
8/10 मामलों में ए सही है। अन्य 2/10 unique_ptr
और के बीच विभाजित हैं weak_ptr
। इसके अलावा, weak_ptr
आम तौर पर परिपत्र संदर्भों को तोड़ने के लिए उपयोग किया जाता है; मुझे यकीन नहीं है कि आपका उपयोग सही माना जाएगा।
device
डेटा सदस्य के लिए क्या स्वामित्व चाहते हैं ? आपको सबसे पहले यह तय करना होगा।
unique_ptr
इसके बजाय उपयोग कर सकता हूं और कंस्ट्रक्टर को कॉल करते समय स्वामित्व दे सकता हूं , अगर मुझे पता है कि मुझे अब इसके लिए आवश्यकता नहीं होगी। लेकिन Settings
कक्षा के डिजाइनर के रूप में मुझे नहीं पता कि क्या कॉलर एक संदर्भ भी रखना चाहता है। हो सकता है कि डिवाइस का उपयोग कई स्थानों पर किया जाएगा। ठीक है, शायद यही आपकी बात है। उस स्थिति में, मैं एकमात्र स्वामी नहीं रहूंगा और जब मैं share_ptr का उपयोग करूंगा, तो मुझे लगता है। और: इसलिए स्मार्ट पॉइंट पॉइंटर्स को रिप्लेस करते हैं, लेकिन रेफरेंस नहीं?
device
कंस्ट्रक्टर के पास होने के बादsettings
, क्या आप अभी भी कॉलिंग स्कोप में इसका उल्लेख कर सकते हैं या केवल इसके माध्यम सेsettings
? यदि उत्तरार्द्ध,unique_ptr
उपयोगी है। इसके अलावा, क्या आपके पास एक परिदृश्य है जहां रिटर्न का मूल्यgetDevice()
हैnull
। यदि नहीं, तो एक संदर्भ वापस करें।