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...
}
ধরা যাক আমি স্মার্ট পয়েন্টারগুলির সাথে পয়েন্টারগুলি প্রতিস্থাপন করতে চাই। এ 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
ক্লাসের আমি জানি না কলার পাশাপাশি একটি রেফারেন্স রাখতে চান কিনা। সম্ভবত ডিভাইসটি অনেক জায়গায় ব্যবহার করা হবে। ঠিক আছে, সম্ভবত এটি আপনার পয়েন্ট। সেক্ষেত্রে আমি একমাত্র মালিক হতে পারব না এবং আমি যখন শেয়ার_পিটার ব্যবহার করব তখন আমার ধারণা। এবং: সুতরাং স্মার্ট পয়েন্টগুলি পয়েন্টারগুলি প্রতিস্থাপন করে, তবে উল্লেখগুলি নয়, তাই না?
device
এর কনস্ট্রাক্টর পাস করার পরেsettings
, আপনি কি এখনও কলিং স্কোপে এটি উল্লেখ করতে সক্ষম হতে চান, বা কেবল মাধ্যমেsettings
? পরেরটি,unique_ptr
দরকারী যদি। এছাড়াও, আপনি একটি দৃশ্যকল্প আছে যেখানে ফেরত মান নাgetDevice()
হয়null
। যদি তা না হয় তবে কেবল একটি রেফারেন্স ফিরিয়ে দিন।