সি ++ তে সি-স্টাইল ইনিশিয়ালাইজারগুলি কন্সট্রাক্টর দ্বারা প্রতিস্থাপন করা হয়েছিল যা সংকলনের সময় দ্বারা নিশ্চিত করা যায় যে কেবলমাত্র বৈধ আরম্ভ হবে (অর্থাত্ প্রাথমিককরণের পরে অবজেক্টের সদস্যরা সামঞ্জস্যপূর্ণ)।
এটি একটি ভাল অনুশীলন, তবে কখনও কখনও প্রাক-সূচনাটি আপনার উদাহরণের মতো কার্যকর। ওওপি এটি বিমূর্ত ক্লাস বা ক্রিয়েশনাল ডিজাইনের ধরণগুলির দ্বারা সমাধান করে ।
আমার মতে, এই নিরাপদ উপায়ে ব্যবহার করা সরলতাটিকে মেরে ফেলে এবং কখনও কখনও সুরক্ষা বাণিজ্য বন্ধও ব্যয়বহুল হতে পারে, কারণ সহজ কোড বজায় রাখার জন্য পরিশীলিত নকশার প্রয়োজন হয় না।
বিকল্প সমাধান হিসাবে, আমি প্রায় সি-স্টাইলের মতো দেখতে সূচনাটি সহজ করার জন্য ল্যাম্বডাস ব্যবহার করে ম্যাক্রোগুলি সংজ্ঞায়িত করার পরামর্শ দিই:
struct address {
int street_no;
const char *street_name;
const char *city;
const char *prov;
const char *postal_code;
};
#define ADDRESS_OPEN [] { address _={};
#define ADDRESS_CLOSE ; return _; }()
#define ADDRESS(x) ADDRESS_OPEN x ADDRESS_CLOSE
ADDRESS ম্যাক্রো প্রসারিত হয়
[] { address _={}; /* definition... */ ; return _; }()
যা ল্যাম্বডাকে তৈরি করে এবং কল করে। ম্যাক্রো প্যারামিটারগুলিও কমা দ্বারা পৃথক করা হয়েছে, সুতরাং আপনাকে আরম্ভকারীটিকে বন্ধনীতে লাগাতে হবে এবং পছন্দ করতে হবে
address temp_address = ADDRESS(( _.city = "Hamilton", _.prov = "Ontario" ));
আপনি জেনারালাইজড ম্যাক্রো ইনিশিয়ালাইজারও লিখতে পারেন
#define INIT_OPEN(type) [] { type _={};
#define INIT_CLOSE ; return _; }()
#define INIT(type,x) INIT_OPEN(type) x INIT_CLOSE
কিন্তু তারপরে কলটি কিছুটা কম সুন্দর
address temp_address = INIT(address,( _.city = "Hamilton", _.prov = "Ontario" ));
তবে আপনি সাধারণ আইএনআইটি ম্যাক্রো সহজেই ব্যবহার করে অ্যাড্রেস ম্যাক্রো সংজ্ঞায়িত করতে পারেন
#define ADDRESS(x) INIT(address,x)