সুস্পষ্ট নির্মাণকারী একাধিক যুক্তি গ্রহণ করছে


88

একাধিক যুক্তিযুক্ত কনস্ট্রাক্টর তৈরি করার কি explicitকোনও (কার্যকর) প্রভাব আছে?

উদাহরণ:

class A {
    public:
        explicit A( int b, int c ); // does explicit have any (useful) effect?
};

উত্তর:


120

সি ++ 11 অবধি, হ্যাঁ, explicitমাল্টি-আরগ নির্মাণকারীকে ব্যবহার করার কোনও কারণ নেই ।

এটি সি ++ 11-এ পরিবর্তিত হয় কারণ ইনিশিয়ালাইজার তালিকার কারণে। প্রাথমিকভাবে, কপিরাইট-ইনিশিয়ালাইজেশন (তবে সরাসরি সূচনা নয়) প্রাথমিক স্তরের তালিকার সাথে কনস্ট্রাক্টরকে চিহ্নিত না করা দরকার explicit

উদাহরণ:

struct Foo { Foo(int, int); };
struct Bar { explicit Bar(int, int); };

Foo f1(1, 1); // ok
Foo f2 {1, 1}; // ok
Foo f3 = {1, 1}; // ok

Bar b1(1, 1); // ok
Bar b2 {1, 1}; // ok
Bar b3 = {1, 1}; // NOT OKAY

4
আমি মনে করি "উত্তরটি আমি কেন চাই" বা "কখন এই ব্যবহারযোগ্য" ব্যাখ্যা দিয়ে এই উত্তরটি আরও ভাল হবে।
ম্যাটিউজএল

@ ম্যাটিউজএল এডগার এর উত্তর সম্ভবত এটি কার্যকর হতে পারে তার জন্য সর্বোত্তম যুক্তি দেয় (এবং যুক্তিযুক্তভাবে টিকটির প্রাপ্য)। কারণ এটা সেখানে , যদিও, কেবল কারণ এটি জন্য বিদ্যমান শব্দার্থবিদ্যা লজিক্যাল এক্সটেনশন হয় explicit। আমি ব্যক্তিগতভাবে মাল্টি-আরগ কনস্ট্রাক্টর তৈরির বিষয়ে বিরক্ত করব না explicit
স্নেফটেল


24

@ স্টেরিটেলার এবং @ স্নেফটেলের চমৎকার উত্তরগুলি মূল কারণ। যাইহোক, আইএমএইচও, এটি ভবিষ্যতে প্রুফিংয়ের অংশ হিসাবে পরে কোডটিতে পরিবর্তিত হয়, এর অর্থ (কমপক্ষে আমি এটি করি) makes আপনার উদাহরণ বিবেচনা করুন:

class A {
    public:
        explicit A( int b, int c ); 
};

এই কোড থেকে সরাসরি উপকার হয় না explicit

কিছু সময় পরে, আপনি এর জন্য একটি ডিফল্ট মান যুক্ত করার সিদ্ধান্ত নিয়েছেন c, তাই এটি এটি হয়ে যায়:

class A {
    public:
        A( int b, int c=0 ); 
};

এটি করার সময়, আপনি cপ্যারামিটারটির দিকে মনোযোগ দিচ্ছেন - পূর্ববর্তী ক্ষেত্রে, এটির একটি ডিফল্ট মান হওয়া উচিত। আপনি Aনিজেরাই নিখুঁতভাবে নির্মিত উচিত কিনা তা নিয়ে অবিচ্ছিন্নভাবে আলোচনা করছেন না । দুর্ভাগ্যক্রমে, এই পরিবর্তনটি explicitআবার প্রাসঙ্গিক করে তোলে ।

সুতরাং, কোনও সিটিরটি বোঝাতে explicitযাতে প্রথমে পদ্ধতিটি লেখার সময় এটি প্রদান করতে পারে।


তবে কী হবে যখন রক্ষণাবেক্ষণকারী সেই ডিফল্ট যুক্ত করে এবং সিদ্ধান্তে পৌঁছায় যে ফলাফলটি রূপান্তরকারী কনস্ট্রাক্টর হিসাবে পাওয়া উচিত ? এখন তারা আছে অপসারণ যে explicitযে চিরকাল হয়েছে, এবং কারিগরি সহায়তা যে পরিবর্তন সম্পর্কে কলের মাধ্যমে প্লাবিত করা হবে এবং ব্যয় ঘণ্টা ব্যাখ্যা করলেন যে explicitশুধু গোলমাল ছিল, এবং এটি নিরীহ হয় সরানোর যে। ব্যক্তিগতভাবে, আমি ভবিষ্যতের ভবিষ্যদ্বাণী করতে খুব একটা ভাল না; এটি হার্ড যথেষ্ট সিদ্ধান্ত কি একটি ইন্টারফেস মত হওয়া উচিত এর এখন
পিট বেকার

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

8

এই আলোচনার জন্য আমার পাঁচটি সেন্ট এখানে:

struct Foo {
    Foo(int, double) {}
};

struct Bar {
    explicit Bar(int, double) {}
};

void foo(const Foo&) {}
void bar(const Bar&) {}

int main(int argc, char * argv[]) {
    foo({ 42, 42.42 }); // valid
    bar({ 42, 42.42 }); // invalid
    return 0;
}

আপনি সহজেই দেখতে পাচ্ছেন, ফাংশন ব্যাকস এর explicitপাশাপাশি barআর্টিকালাইজার তালিকাটি ব্যবহার করতে বাধা দেয় কারণ নির্মাতা struct Barহিসাবে ঘোষণা করা হয় explicit

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