আমি / কখন আমার নির্মাতাকে স্পষ্টভাবে মুছতে চাইব? কারণটি ধরে নিলে এর ব্যবহার প্রতিরোধ করা, কেন এটি কেবল তৈরি করা যায় না private?
class Foo
{
public:
Foo() = delete;
};
আমি / কখন আমার নির্মাতাকে স্পষ্টভাবে মুছতে চাইব? কারণটি ধরে নিলে এর ব্যবহার প্রতিরোধ করা, কেন এটি কেবল তৈরি করা যায় না private?
class Foo
{
public:
Foo() = delete;
};
delete । প্রশ্ন এবং লুচিয়ানের উত্তর উভয়ই গঠনমূলক হিসাবে যোগ্যতা অর্জন করে। যে কেউ সি ++ 11 এর সূক্ষ্ম বিন্দুতে শ্বাস ফেলছে না তবে শীঘ্রই উভয়ের মধ্যেই কিছু পাওয়া যাবে।
উত্তর:
কেমন:
//deleted constructor
class Foo
{
public:
Foo() = delete;
public:
static void foo();
};
void Foo::foo()
{
Foo f; //illegal
}
বনাম
//private constructor
class Foo
{
private:
Foo() {}
public:
static void foo();
};
void Foo::foo()
{
Foo f; //legal
}
এগুলি মূলত বিভিন্ন জিনিস। privateআপনাকে বলে যে কেবল শ্রেণীর সদস্যরা সেই পদ্ধতিটি কল করতে পারেন বা সেই পরিবর্তনশীল (বা অবশ্যই বন্ধুরা) অ্যাক্সেস করতে পারেন। এই ক্ষেত্রে, staticসেই শ্রেণীর কোনও পদ্ধতির (বা অন্য কোনও সদস্য) privateকোনও শ্রেণীর একজন কনস্ট্রাক্টরকে কল করা আইনী । এটি মোছা কনস্ট্রাক্টরদের জন্য ধারণ করে না।
নমুনা এখানে ।
কেন স্পষ্টভাবে নির্মাণকারী মুছে ফেলুন?
আর একটি কারণ:
আমি deleteযখন আশ্বাস দিতে চাই যে আমি একটি ক্লাসটি একটি ইনিশিয়ালাইজারের সাথে ডেকে আছি তখন আমি ব্যবহার করি। আমি রানটাইম চেক ছাড়াই এটি অর্জনের একটি খুব মার্জিত উপায় হিসাবে বিবেচনা করি।
সি ++ সংকলকটি আপনার জন্য এটি পরীক্ষা করে।
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
এটি - খুব সরলীকৃত - কোড আশ্বাস দেয় যে এর মতো কোনও ইনস্ট্যান্টেশন নেই:Foo foo;
Fooকেবলমাত্র একটি ডিফল্ট না হয়ে অসংখ্য কনস্ট্রাক্টর থাকে তবে Foo foo;সমস্ত মিলিয়ে স্পষ্টভাবে সংজ্ঞায়িত, সুরক্ষিত এবং প্রাইভেট কনস্ট্রাক্টরের তালিকার তুলনায় দীর্ঘতর ত্রুটির কারণ হতে পারে।
আমি এলএলভিএমের উত্স কোডে (মুখ্য হিসাবে AlignOf.h এ) 'মুছে ফেলা' হিসাবে ঘোষিত ডিফল্ট সিটারগুলির সাথে দেখা করেছি। সম্পর্কিত শ্রেণীর টেম্পলেটগুলি সাধারণত 'llvm :: বিস্তারিত' নামে একটি বিশেষ নেমস্পেসে থাকে। আমার মনে হয় সেখানে পুরো উদ্দেশ্যটি ছিল তারা class শ্রেণিকে কেবল সহায়ক সহায়ক হিসাবে বিবেচনা করেছিল। তারা কখনও তাদের তাত্ক্ষণিক করার ইচ্ছা করেনি; সংকলন সময়ে চলমান কিছু রূপক কৌশলগুলি সহ কেবলমাত্র অন্যান্য শ্রেণীর টেম্পলেটগুলির প্রসঙ্গে তাদের ব্যবহার করতে।
যেমন এই AlignmentCalcImpl শ্রেণীর টেম্পলেট রয়েছে যা কেবলমাত্র AlignOf নামে মাপের (।) অপারেটরের প্যারামিটার হিসাবে ব্যবহৃত অন্য শ্রেণীর টেম্পলেটের মধ্যে ব্যবহৃত হয়। সংকলন সময়ে এই অভিব্যক্তি মূল্যায়ন করা যেতে পারে; এবং টেমপ্লেটটি ইনস্ট্যান্ট করার দরকার নেই -> তাই এই উদ্দেশ্যটি প্রকাশ করতে ডিফল্ট কর্টর মুছুন না কেন।
তবে এটি কেবল আমার অনুমান।
= default, এমনকি শ্রেণিও এটি ব্যবহার করতে পারে না এবং আমি ব্যক্তিগতভাবে মুছে ফেলা ফাংশনটির ব্যবহার দেখতে পছন্দ করি । ওভার ফাংশন ব্যক্তিগত। প্রাক্তন স্পষ্টতই বলে দেয় "এটি ব্যবহার করার উদ্দেশ্যে নয়" " যদি এর থেকে কিছু বেরিয়ে আসে, শ্রেণি এটি ব্যবহার করতে সক্ষম না হওয়ায় প্রকৃতপক্ষে শব্দার্থগত পার্থক্য তৈরি করে।