@ সেবাস্তিয়ানআরডেল ইতিমধ্যে সহজ, সরাসরি উত্তর দিয়েছেন, তবে কিছু অতিরিক্ত ব্যাখ্যা কার্যকর হতে পারে।
টিএল; ডিআর = কন্সট্রাক্টরদের সহজ রাখার জন্য একটি স্টাইলের নিয়ম রয়েছে, এর কারণ রয়েছে তবে এই কারণগুলি বেশিরভাগ ক্ষেত্রেই কোডিংয়ের historicতিহাসিক (বা কেবল খারাপ) শৈলীর সাথে সম্পর্কিত। কনস্ট্রাক্টরগুলিতে ব্যাতিক্রমের হ্যান্ডলিং ভালভাবে সংজ্ঞায়িত করা হয়েছে এবং ধ্বংসকারীদের এখনও সম্পূর্ণরূপে নির্মিত স্থানীয় ভেরিয়েবল এবং সদস্যদের জন্য ডাকা হবে, যার অর্থ আইডেম্যাটিক সি ++ কোডে কোনও সমস্যা হওয়া উচিত নয়। শৈলীর নিয়ম যাইহোক চলতে থাকে, তবে সাধারণত এটি কোনও সমস্যা নয় - সমস্ত সূচনাটি কনস্ট্রাক্টরে থাকতে হয় না, এবং বিশেষত সেই নির্মাণকারীর প্রয়োজন হয় না।
এটি একটি সাধারণ শৈলীর নিয়ম যা নির্ধারিত বৈধ রাষ্ট্র স্থাপনের জন্য নির্মাতাদের সর্বনিম্ন সর্বনিম্ন করণীয়। যদি আপনার সূচনাটি আরও জটিল হয় তবে এটি নির্মাণকারীর বাইরে পরিচালনা করা উচিত। আপনার নির্মাতা সেট আপ করতে পারে এমন কোনও সস্তা-ইনিশিয়াল মান না থাকলে, আপনার ক্লাস দ্বারা প্রবর্তিত আক্রমণকারীদের একটি যুক্ত করার জন্য আপনার দুর্বল করা উচিত। উদাহরণস্বরূপ, যদি আপনার শ্রেণীর পরিচালনার জন্য স্টোরেজ বরাদ্দ করা খুব ব্যয়বহুল হয় তবে একটি বরাদ্দ না হওয়া-এখনও নাল স্টেট যুক্ত করুন, কারণ অবশ্যই নলের মতো বিশেষ ক্ষেত্রে থাকা অবস্থায় কখনও কারও সমস্যা হয় না। হুম।
যদিও সাধারণ, অবশ্যই এই চরম আকারে এটি পরম থেকে একেবারেই দূরে। বিশেষত, আমার বিদ্রূপের ইঙ্গিত হিসাবে, আমি শিবিরে আছি যে বলে দুর্বল আক্রমণকারীদের প্রায় সবসময়ই দাম খুব বেশি। তবে শৈলীর নিয়মের পিছনে কারণ রয়েছে এবং ন্যূনতম নির্মাতা এবং শক্তিশালী আক্রমণকারী উভয়ই থাকার উপায় রয়েছে ।
কারণগুলি স্বয়ংক্রিয়ভাবে ডেস্ট্রাক্টর ক্লিনআপ সম্পর্কিত, বিশেষত ব্যতিক্রমগুলির ক্ষেত্রে। মূলত, সংকলক ধ্বংসকারীদের কল করার জন্য দায়বদ্ধ হয়ে উঠলে একটি সংজ্ঞায়িত পয়েন্ট থাকতে হবে। আপনি এখনও কোনও কনস্ট্রাক্টর কলে রয়েছেন, অবজেক্টটি অগত্যা সম্পূর্ণরূপে নির্মিত হয়নি, সুতরাং সেই বস্তুর জন্য ডেস্ট্রাক্টরকে কল করা বৈধ নয়। অতএব, নির্মাণকারী সফলভাবে সম্পূর্ণ হলে অবজেক্টটি ধ্বংস করার দায়িত্ব কেবল সংকলকটিতে স্থানান্তর করে। এটি আরআইআইআই (রিসোর্স অ্যালোকেশন ইজ ইনিশিয়ালাইজেশন) নামে পরিচিত যা সত্যই সেরা নাম নয়।
যদি কনস্ট্রাক্টরের অভ্যন্তরে কোনও ব্যতিক্রম নিক্ষেপ ঘটে, তবে অংশ-নির্মিত কোনও কিছু পরিষ্কারভাবে পরিষ্কার করা দরকার, সাধারণত একটিতে try .. catch
।
তবে ইতিমধ্যে সফলভাবে নির্মিত অবজেক্টের উপাদানগুলি ইতিমধ্যে সংকলকদের দায়বদ্ধ। এর অর্থ হ'ল বাস্তবে এটি কোনও বড় বিষয় নয়। যেমন
classname (args) : base1 (args), member2 (args), member3 (args)
{
}
এই নির্মাতার শরীর খালি। তাই দীর্ঘ জন্য কনস্ট্রাকটর base1
, member2
এবং member3
ব্যতিক্রম নিরাপদ, সেখানে চিন্তার কিছু নেই আছে। উদাহরণস্বরূপ, যদি কনস্ট্রাক্টর member2
নিক্ষেপ করে তবে সেই কনস্ট্রাক্টর নিজেকে পরিষ্কার করার জন্য দায়বদ্ধ। বেসটি base1
ইতিমধ্যে সম্পূর্ণরূপে নির্মিত হয়েছিল, তাই এর ধ্বংসকারীকে স্বয়ংক্রিয়ভাবে কল করা হবে। member3
এমনকি আংশিকভাবে কখনও নির্মিত হয়নি, তাই পরিষ্কার করার দরকার নেই।
এমনকি কোনও দেহ থাকলেও, স্থানীয় ভেরিয়েবলগুলি ব্যতিক্রম ছোঁড়ার আগে সম্পূর্ণরূপে নির্মিত হয়েছিল অন্য কোনও ফাংশনের মতোই স্বয়ংক্রিয়ভাবে ধ্বংস হয়ে যাবে। কনস্ট্রাক্টর সংস্থা যেগুলি কাঁচা পয়েন্টারগুলিকে জাল করে তোলে, বা "নিজস্ব" কিছু প্রকারের অন্তর্নিহিত অবস্থা (অন্য কোথাও সঞ্চিত) - সাধারণত অর্থ একটি শুরুর / অর্জন ফাংশন কল অবশ্যই একটি শেষ / রিলিজ কলের সাথে মিলিত হতে পারে - ব্যতিক্রমের সুরক্ষা সমস্যার কারণ হতে পারে, তবে সেখানে আসল সমস্যা দেখা দেয় একটি শ্রেণীর মাধ্যমে কোনও সংস্থান সঠিকভাবে পরিচালনা করতে ব্যর্থ হচ্ছে। উদাহরণস্বরূপ, আপনি যদি কাঁচা পয়েন্টারগুলি unique_ptr
কনস্ট্রাক্টরের সাথে প্রতিস্থাপন করেন unique_ptr
তবে প্রয়োজনে ডিস্ট্রাক্টরকে স্বয়ংক্রিয়ভাবে ডাকা হবে।
লোকেরা সর্বনিম্ন নির্মাণকারীর পক্ষে অগ্রাধিকার দেওয়ার অন্যান্য কারণগুলি এখনও রয়েছে। একটি কেবল স্টাইলের নিয়ম বিদ্যমান থাকার কারণে, অনেকে মনে করেন কনস্ট্রাক্টর কলগুলি সস্তা। এটির এখনও একটি শক্তিশালী আক্রমণকারী থাকার একটি উপায় হ'ল পৃথক কারখানা / বিল্ডার শ্রেণি রয়েছে যার পরিবর্তে দুর্বল আক্রমণকারীরা রয়েছে এবং যা সাধারণ সদস্য-ফাংশন কলগুলি ব্যবহার করে প্রয়োজনীয় প্রাথমিক মান সেট করে। আপনার প্রাথমিক অবস্থাটি একবার হয়ে গেলে, শক্তিশালী আক্রমণকারীদের সাথে ক্লাসের কনস্ট্রাক্টরের পক্ষে যুক্তি হিসাবে সেই বস্তুটি পাস করুন। এটি দুর্বল-আক্রমণকারী বস্তুর "সাহস চুরি" করতে পারে - শব্দার্থিক পদক্ষেপ - যা একটি সস্তা (এবং সাধারণত noexcept
) অপারেশন)
এবং অবশ্যই আপনি এটি কোনও make_whatever ()
ফাংশনে মুড়িয়ে রাখতে পারেন , সুতরাং সেই ফাংশনটির কলকারীদের কখনই দুর্বল-আক্রমণকারী শ্রেণীর উদাহরণ দেখার প্রয়োজন হয় না।