আমি একটি ফাংশনে একটি ভাগ করা পয়েন্টারটি পাস করতে চাই। আপনি কি আমাকে সাহায্য করতে পারেন?
অবশ্যই, আমি আপনাকে এটি সাহায্য করতে পারেন। আমি ধরে নিলাম সি ++ এ আপনার মালিকানা শব্দার্থ সম্পর্কে কিছুটা বোঝাপড়া আছে। এটা কি সত্যি?
হ্যাঁ, আমি বিষয়টিতে যুক্তিসঙ্গতভাবে আরামদায়ক।
ভাল.
ঠিক আছে, আমি একটি shared_ptrযুক্তি নেওয়ার জন্য কেবল দুটি কারণ সম্পর্কে চিন্তা করতে পারি :
- ফাংশনটি অবজেক্টের মালিকানা ভাগ করতে চায়;
- ফাংশনটি কিছু অপারেশন করে যা বিশেষত
shared_ptrএসগুলিতে কাজ করে ।
আপনি কোনটি সম্পর্কে আগ্রহী?
আমি একটি সাধারণ উত্তর খুঁজছি, তাই আমি উভয়ই সম্পর্কে আগ্রহী। যদিও আপনি # 2 এর ক্ষেত্রে কী বোঝাতে চাইছেন তা সম্পর্কে আমি আগ্রহী।
এই জাতীয় ফাংশনগুলির উদাহরণগুলির মধ্যে রয়েছে std::static_pointer_cast, কাস্টম তুলকগুলি বা পূর্বাভাস। উদাহরণস্বরূপ, যদি আপনাকে কোনও ভেক্টর থেকে সমস্ত অনন্য শেয়ারড_পিটার খুঁজে পেতে হয় তবে আপনার এ জাতীয় একটি প্রাকটিকের প্রয়োজন।
আহ, যখন ফাংশনটি আসলে স্মার্ট পয়েন্টারটি নিজেই পরিচালনা করে।
হুবহু
সেক্ষেত্রে, আমি মনে করি আমাদের রেফারেন্স দিয়ে পাস করা উচিত।
হ্যাঁ. এবং যদি এটি পয়েন্টারটি পরিবর্তন না করে তবে আপনি কনস্টেন্ট রেফারেন্স দিয়ে যেতে চান। আপনার মালিকানা ভাগ করার প্রয়োজন নেই বলে অনুলিপি করার দরকার নেই। এটাই অন্য পরিস্থিতি।
ঠিক আছে বুঝেছি. অন্যান্য দৃশ্যের কথা বলা যাক।
আপনি যেখানে মালিকানা ভাগ? ঠিক আছে. আপনি কীভাবে এর সাথে মালিকানা ভাগ করবেন shared_ptr?
কপি করে।
তাহলে ফাংশনটির একটি অনুলিপি তৈরি করা দরকার shared_ptr?
স্পষ্টতই। সুতরাং আমি কনস্টের একটি রেফারেন্স দিয়ে এটি পাস এবং একটি স্থানীয় ভেরিয়েবল অনুলিপি?
না, এটি হতাশাব্যঞ্জক। যদি এটি রেফারেন্স দিয়ে পাস হয় তবে ফাংশনটির ম্যানুয়ালি অনুলিপি তৈরি করা ছাড়া কোনও বিকল্প থাকবে না। যদি এটি মান দ্বারা পাস হয় তবে সংকলক একটি অনুলিপি এবং একটি চালনার মধ্যে সেরা পছন্দটি চয়ন করবে এবং এটি স্বয়ংক্রিয়ভাবে সম্পাদন করবে। সুতরাং, মান দ্বারা পাস।
ভাল যুক্তি. আমার অবশ্যই মনে রাখতে হবে যে " গতি চান? মূল্য দিয়ে পাস করুন " নিবন্ধটি আরও প্রায়ই।
অপেক্ষা করুন, যদি ফাংশনটি shared_ptrকোনও সদস্য ভেরিয়েবলের মধ্যে রাখে, উদাহরণস্বরূপ? এটি কি অপ্রয়োজনীয় অনুলিপি তৈরি করবে না?
ফাংশনটি কেবল shared_ptrযুক্তিটিকে তার স্টোরেজে স্থানান্তরিত করতে পারে। একটি মুভিং shared_ptrসস্তা কারণ এটি কোনও রেফারেন্স গুন পরিবর্তন করে না।
আহ, ভাল ধারণা।
তবে আমি একটি তৃতীয় দৃশ্যের কথা ভাবছি: আপনি যদি কারসাজি করতে না চান shared_ptr, না মালিকানা ভাগ করতে চান ?
সেক্ষেত্রে, shared_ptrসম্পূর্ণরূপে ফাংশন অপ্রাসঙ্গিক। আপনি যদি পয়েন্টটি হস্তান্তর করতে চান তবে একজন পয়েন্টি নিন এবং কলকারীরা তাদের মালিকানা কী শব্দার্থক চান তা বাছাই করুন।
এবং আমি রেফারেন্স দ্বারা বা মান দ্বারা পয়েন্টটি নেওয়া উচিত?
সাধারণ নিয়ম প্রযোজ্য। স্মার্ট পয়েন্টারগুলি কোনও কিছুই পরিবর্তন করে না।
আমি অনুলিপি করতে চাইলে মান দ্বারা পাস, আমি একটি অনুলিপি এড়াতে চাইলে রেফারেন্স দিয়ে পাস করুন
ঠিক।
হুঁ। আমার মনে হয় আপনি আর একটি দৃশ্য ভুলে গেছেন। আমি যদি মালিকানা ভাগ করতে চাই তবে কেবল একটি নির্দিষ্ট শর্তের উপর নির্ভর করে?
আহ, একটি আকর্ষণীয় প্রান্ত মামলা। আমি প্রায়শই এমনটি আশা করি না। তবে যখন এটি হয় আপনি হয় মান দ্বারা পাস করতে পারেন এবং অনুলিপিটি আপনার প্রয়োজন না হলে উপেক্ষা করতে পারেন, বা রেফারেন্স দিয়ে পাস করুন এবং আপনার প্রয়োজন হলে অনুলিপি তৈরি করতে পারেন।
আমি প্রথম অপশনটিতে একটি রিন্ডন্ড্যান্ট অনুলিপি ঝুঁকি নিয়েছি এবং দ্বিতীয়টিতে একটি সম্ভাব্য পদক্ষেপ হারিয়ে ফেলেছি। আমি কি কেক খেতে পারি না এবং তাও খেতে পারি?
যদি আপনি এমন পরিস্থিতিতে থাকেন যা সত্যই গুরুত্বপূর্ণ, আপনি দুটি ওভারলোড সরবরাহ করতে পারেন, একটি কনস্ট কনভার্ট রেভেলু রেফারেন্স এবং অন্যটি মূল্যের রেফারেন্স নিয়ে। একটি অনুলিপি, অন্য সরানো। একটি নিখুঁত-ফরোয়ার্ডিং ফাংশন টেম্পলেট অন্য বিকল্প another
আমি মনে করি এটি সম্ভাব্য সমস্ত পরিস্থিতিতে জুড়েছে। আপনাকে অনেক ধন্যবাদ.
const std::shared_ptr<myClass>& arg1