নেই সি ++ 11 মান গ্রন্থাগার A থেকে রূপান্তর করতে কোন উপযোগ প্রদান std::shared_ptr
করতে std::unique_ptr
, অথবা বিপরীতভাবে ভাইস? এই নিরাপদ অপারেশন?
shared_ptr
।
নেই সি ++ 11 মান গ্রন্থাগার A থেকে রূপান্তর করতে কোন উপযোগ প্রদান std::shared_ptr
করতে std::unique_ptr
, অথবা বিপরীতভাবে ভাইস? এই নিরাপদ অপারেশন?
shared_ptr
।
উত্তর:
std::unique_ptr
একচেটিয়া মালিকানা প্রকাশের সি ++ 11 উপায়, তবে এর অন্যতম আকর্ষণীয় বৈশিষ্ট্য হ'ল এটি সহজে এবং দক্ষতার সাথে একটিতে রূপান্তরিত হয়std::shared_ptr
।এটি
std::unique_ptr
কারখানার ফাংশন রিটার্ন টাইপের মতো কেন এত উপযুক্ত। কারখানার ফাংশনগুলি জানতে পারে না যে কলাররা তাদের ফিরে আসা অবজেক্টের জন্য একচেটিয়া মালিকানা শব্দার্থ ব্যবহার করতে চাইবে বা ভাগ করে নেওয়া মালিকানা (যেমন,std::shared_ptr
) আরও উপযুক্ত হবে কিনা । ফিরিয়ে দেওয়ার মাধ্যমেstd::unique_ptr
, কলকারখানা কলকারীদেরকে সবচেয়ে দক্ষ স্মার্ট পয়েন্টার সরবরাহ করে, তবে কলারদের এটি আরও নমনীয় ভাইবিলের সাথে প্রতিস্থাপন করতে বাধা দেয় না।
std::shared_ptr
করারstd::unique_ptr
অনুমতি নেই। একবার আপনি কোনও উত্সের আজীবন পরিচালনাকে একটিতে পরিণত করার পরেstd::shared_ptr
, আপনার মন পরিবর্তন হয় না। এমনকি যদি রেফারেন্স গণনা এক হয় তবে আপনিstd::unique_ptr
এটি পরিচালনা করতে, বলতে, আপনি উত্সটির মালিকানা দাবি করতে পারবেন না ।তথ্যসূত্র: কার্যকর আধুনিক সি ++। আপনার সি ++ 11 এবং সি ++ 14 এর ব্যবহার উন্নত করার জন্য বিশেষ উপায়। স্কট মায়ার্স
সংক্ষেপে বলতে গেলে, আপনি সহজেই এবং দক্ষতার একটি রূপান্তর করতে পারেন std::unique_ptr
করার std::shared_ptr
কিন্তু আপনি রূপান্তর করতে পারবেন না std::shared_ptr
করার std::unique_ptr
।
উদাহরণ স্বরূপ:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
বা:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptr
একটি থেকে std::shared_ptr
।
std::unique_ptr
একটি মধ্যে std::shared_ptr
? স্ট্যান্ডার্ড লাইব্রেরি একটি মুভ অ্যাসাইনমেন্ট অপারেটরের template<class Y, class Deleter> shared_ptr& operator=(std::unique_ptr<Y, Deleter>&& r);
জন্য সংজ্ঞা দেয় std::shared_ptr<T>
।
ইউনিক_সিপিআর_আপনার দেওয়া হয়েছে, শেয়ারড_পিটার এস_পিটিআর তৈরি করুন:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
অন্য পথে যাওয়া অবৈধ।
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
ভিতরে থাকা unique_ptr