একটি বেস টাইপ shared_ptrগ্রহণ করে এমন কোনও ফাংশনে ডেরাইভেড টাইপটি পাস করার সর্বোত্তম পদ্ধতি কী shared_ptr?
shared_ptrঅযথা অনুলিপি এড়াতে আমি সাধারণত রেফারেন্স দিয়ে পাস করি :
int foo(const shared_ptr<bar>& ptr);
তবে আমি যদি কিছু করার চেষ্টা করি তবে এটি কাজ করে না
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
আমি ব্যবহার করতে পারে
foo(dynamic_pointer_cast<Base, Derived>(bar));
তবে এটি দুটি কারণে উপ-অনুকূল বলে মনে হচ্ছে:
- একটি
dynamic_castএকটি বিট একটি সহজ জন্য অত্যধিক উদ্ভূত টু বেস ঢালাই বলে মনে হয়। - যেহেতু আমি এটি বুঝতে পারি,
dynamic_pointer_castফাংশনে যাওয়ার জন্য পয়েন্টারের একটি অনুলিপি (অস্থায়ী এক হলেও) তৈরি করে।
এর চেয়ে ভাল সমাধান কি আছে?
উত্তরোত্তর জন্য আপডেট:
এটি হারিয়ে যাওয়া শিরোনাম ফাইলটির একটি সমস্যা হিসাবে প্রমাণিত হয়েছিল। এছাড়াও, আমি এখানে যা করার চেষ্টা করছিলাম এটি একটি অ্যান্টিপ্যাটার্ন হিসাবে বিবেচিত হয়। সাধারণত
কোনও কার্যক্রমে যে কোনও বস্তুর আজীবন প্রভাবিত করে না (যেমন বস্তুর কার্যকালীন সময়ের জন্য বৈধ থাকে) একটি সাধারণ রেফারেন্স বা পয়েন্টার গ্রহণ করা উচিত, যেমন
int foo(bar& b)।কার্যাবলী যে গ্রাস একটি বস্তু (যেমন একটি প্রদত্ত বস্তুর চূড়ান্ত ব্যবহারকারী) একটি গ্রহণ করা উচিত
unique_ptrযেমন, মানint foo(unique_ptr<bar> b)। কলকারীদেরstd::moveফাংশনের মধ্যে মান হওয়া উচিত ।কোনও বস্তুর আজীবন প্রসারিত ক্রিয়াকলাপগুলি
shared_ptrমান হিসাবে নেওয়া উচিত , উদাহরণস্বরূপint foo(shared_ptr<bar> b)। বিজ্ঞপ্তি রেফারেন্স এড়ানোর জন্য সাধারণ পরামর্শ প্রযোজ্য।
বিশদগুলির জন্য হার্ব সটারের ব্যাক টু বেসিকগুলিতে দেখুন।
shared_ptr? বারের কনস্ট্যান্ড রেফারেন্স কেন?