একটি কাস্টম মুছুন ব্যবহার করুন
সমস্যাটি হ'ল unique_ptr<T>
ডিস্ট্রাক্টরকে T::~T()
তার নিজস্ব ডেস্ট্রাক্টর, তার মুভ অ্যাসাইনমেন্ট অপারেটর এবং unique_ptr::reset()
সদস্য ফাংশনটিতে (কেবল) কল করতে হবে। তবে এগুলি অবশ্যই বেশ কয়েকটি পিআইএমপিএল পরিস্থিতিতে (ইতিমধ্যে বাহ্যিক শ্রেণীর ডেস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটরটিতে) ডাকা উচিত (স্পষ্ট বা স্পষ্টতই)।
হিসাবে ইতিমধ্যেই অন্য উত্তরে নির্দিষ্ট, এক উপায় যে এড়াতে সরানো হয় সব অপারেশন যে প্রয়োজন unique_ptr::~unique_ptr()
, unique_ptr::operator=(unique_ptr&&)
এবং unique_ptr::reset()
সোর্স ফাইল যেখানে pimpl সাহায্যকারী বর্গ আসলে সংজ্ঞায়িত করা হয় মধ্যে।
যাইহোক, এটি বরং অসুবিধাগুলি এবং pimpl idoim এর একেবারে বিন্দুটিকে কিছুটা ডিগ্রী দেয়। একটি অনেক ক্লিনার সমাধান যা কাস্টম মোছার ব্যবহার করে এবং মুদ্রা সহায়ক সহায়ক শ্রেণি যেখানে থাকে কেবল উত্স ফাইলে তার সংজ্ঞাটি স্থানান্তরিত করে তা থেকে বিরত থাকে। এখানে একটি সহজ উদাহরণ:
// file.h
class foo
{
struct pimpl;
struct pimpl_deleter { void operator()(pimpl*) const; };
std::unique_ptr<pimpl,pimpl_deleter> m_pimpl;
public:
foo(some data);
foo(foo&&) = default; // no need to define this in file.cc
foo&operator=(foo&&) = default; // no need to define this in file.cc
//foo::~foo() auto-generated: no need to define this in file.cc
};
// file.cc
struct foo::pimpl
{
// lots of complicated code
};
void foo::pimpl_deleter::operator()(foo::pimpl*ptr) const { delete ptr; }
পৃথক মুছে ফেলার ক্লাসের পরিবর্তে, আপনি ল্যাম্বদার সাথে একত্রে একটি ফ্রি ফাংশন বা static
সদস্য ব্যবহার করতে পারেন foo
:
class foo {
struct pimpl;
static void delete_pimpl(pimpl*);
std::unique_ptr<pimpl,[](pimpl*ptr){delete_pimpl(ptr);}> m_pimpl;
};