ডিফল্ট কনস্ট্রাক্টরকে অব্যবহারযোগ্য করা কি ঠিক?


14

বিশেষত ডিফল্ট নির্মাণকারী সম্পর্কে জিজ্ঞাসা করা

প্রদত্ত যে কন্সট্রাক্টর একটি অবজেক্টের জন্য সমস্ত ডেটা আরম্ভ করে, যদি আমি এমন একটি ক্লাস তৈরি করি যা সঠিক আরম্ভকরণ ব্যতীত ব্যবহার করা যায় না, তবে এটি কি ডিফল্ট কনস্ট্রাক্টর অকেজো হওয়ার মতো ঘটনা নয়? বিবেচনা:

// A class for handling lines in a CSV file
class CSV_Entry {
private:
    unsigned num_entries;
    std::string string_version;
    std::vector<std::string> vector_version;
    ...etc
public:
    CSV_Entry();
    CSV_Entry(const std::string& src_line);

    // returns a vector copy of the original entry
    std::vector<std::string> get_vector_snapshot();
}

int main( void ) {
    ...etc

    CSV_Entry example = CSV_Entry();
    std::vector<std::string> current_entry = example.get_vector_snapshot();

    ...etc
}

যে পরিবর্তনশীল current_entryমূলত অকেজো কোন? কেউ যদি পরে এটি প্রক্রিয়া করার চেষ্টা করে তবে তারা সম্ভবত ত্রুটি পেতে পারে; তারপরে তারা এ জাতীয় ত্রুটিগুলি পরিচালনা করার জন্য কোড তৈরি করতে চাই ...

এই জাতীয় অতিরিক্ত, অপ্রয়োজনীয় কোড প্রশমিত করার জন্য: ডিফল্ট কনস্ট্রাক্টরকে কেন অকেজো করতে হবে না? তাই ভালো,

...etc

CSV_Entry() {
    throw Verbose_Exception( "CSV_Entry: do not use the default constructor" );
}

...etc

পিএস: সাইড নোটে, যদি কেবলমাত্র ডিফল্ট কনস্ট্রাক্টরকে অপ্রয়োজনীয় করা ঠিক হয় তবে শিরোনামে থ্রো রাখা কি ঠিক আছে, যেহেতু অন্য কোনও বাস্তবায়নের বিশদটি প্রকাশিত হয়নি?

উত্তর:


34

হ্যাঁ, কোনও যুক্তি ছাড়াই অবজেক্টটি আরম্ভ করার কোনও বুদ্ধিমান উপায় না থাকলে ডিফল্ট কনস্ট্রাক্টরকে ব্যবহারযোগ্য করে তোলা ভাল (আসলে এটি ভাল )। তবে ব্যতিক্রম ছুঁড়ে দিয়ে এটি "অক্ষম" করবেন না। পরিবর্তে এটিকে ব্যক্তিগত করুন। আদর্শভাবে আপনার ইন্টারফেসে কোনও পদ্ধতি বা নির্মাণকারী লোক থাকবে না "লোকদের" কল করার কথা নয়।


1
সুতরাং, এটি ব্যক্তিগত করে, ব্যবহারকারী কি সংকলন সময়ে ডিফল্ট কনস্ট্রাক্টর ব্যবহার করার চেষ্টা করে?
ব্যবহারকারী2738698

@ user2738698 সঠিক।
ডোভাল

8
আপনি সি ++ 11 ব্যবহার করতে পারেন, তাহলে স্পষ্টভাবে চিহ্নিত যেমন মোছা হয়েছে: CSV_Entry() = delete;
bstamour ২

13
আসলে, এটি এর চেয়েও সহজ নয়? যদি কোনও অ-ডিফল্ট কনস্ট্রাক্টর সংজ্ঞায়িত করা হয় তবে সংকলক সুস্পষ্টভাবে কোনও ডিফল্ট কনস্ট্রাক্টর তৈরি করবে না। এই শ্রেণীর একটি অ-ডিফল্ট নির্ধারক সংজ্ঞায়িত হয়েছে (যা আমি প্রস্তাব করব explicit, বিটিডাব্লু)। সুতরাং আপনি যদি কেবল এটি সংজ্ঞায়িত না করেন তবে এটি উপস্থিত থাকবে না।
ফ্রেড লারসন

7
@ ফ্রেডলারসন স্পষ্টভাবে এটি মুছে ফেলা এটি মুছে ফেলার অভিপ্রায়টি প্রকাশ করে তাই কেউ মনে করে যে এটি ভুল ছিল।
দারখোগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.