আমি সি ++ ইউনিয়নগুলি দেখতে খুব সুন্দর। দেখে মনে হয় লোকেরা কেবল ব্যবহারের ক্ষেত্রেই চিন্তা করে যেখানে কেউ "স্থানে" ইউনিয়নের উদাহরণের মান পরিবর্তন করতে চায় (যা মনে হয় কেবল স্মৃতি বাঁচাতে বা সন্দেহজনক রূপান্তর সম্পাদন করে)।
বাস্তবে, ইউনিয়নগুলি একটি সফ্টওয়্যার ইঞ্জিনিয়ারিং সরঞ্জাম হিসাবে দুর্দান্ত শক্তি হতে পারে, এমনকি আপনি যখন কোনও ইউনিয়নের উদাহরণের মান পরিবর্তন করেন না তখনও ।
কেস 1 ব্যবহার করুন: গিরগিটি
ইউনিয়নগুলির মাধ্যমে, আপনি একটি বর্ণের অধীনে অনেকগুলি স্বেচ্ছাসেবক শ্রেণীর পুনর্গঠন করতে পারেন, এটি একটি বেস শ্রেণীর এবং এর উদ্ভূত শ্রেণীর ক্ষেত্রে মিল নয়। তবে পরিবর্তিত পরিবর্তনগুলি হ'ল আপনি প্রদত্ত ইউনিয়নের উদাহরণ দিয়ে যা করতে এবং করতে পারবেন না:
struct Batman;
struct BaseballBat;
union Bat
{
Batman brucewayne;
BaseballBat club;
};
ReturnType1 f(void)
{
BaseballBat bb = {/* */};
Bat b;
b.club = bb;
// do something with b.club
}
ReturnType2 g(Bat& b)
{
// do something with b, but how do we know what's inside?
}
Bat returnsBat(void);
ReturnType3 h(void)
{
Bat b = returnsBat();
// do something with b, but how do we know what's inside?
}
এটি প্রদর্শিত হয় যে প্রোগ্রামার যখন কোনও ইউনিয়ন উদাহরণ ব্যবহার করতে চায় তখন নির্দিষ্ট ধরণের বিষয়বস্তুর সম্পর্কে নিশ্চিত হতে হবে। এটি fউপরে ফাংশন ক্ষেত্রে । তবে, যদি কোনও ক্রিয়াকলাপটি কোনও সংঘের উদাহরণকে পাশের যুক্তি হিসাবে গ্রহণ করে, যেমন gউপরের ক্ষেত্রে হয় , তবে এটির সাথে কী করতে হবে তা এটি জানত না। ইউনিয়নের উদাহরণ ফিরিয়ে ফাংশনগুলির ক্ষেত্রেও একই প্রযোজ্য, দেখুনh : কলকারী ভিতরে কী আছে তা কীভাবে জানতে পারে?
যদি কোনও ইউনিয়ন উদাহরণ কখনও আর্গুমেন্ট বা রিটার্ন মান হিসাবে পাস না হয়, তবে প্রোগ্রামার যখন তার বিষয়বস্তু পরিবর্তন করতে বেছে নেয় তখন উত্তেজনার স্পাইক সহ এটি খুব একঘেয়ে জীবন ধারণ করতে বাধ্য bound
Batman bm = {/* */};
Baseball bb = {/* */};
Bat b;
b.brucewayne = bm;
// stuff
b.club = bb;
এবং এটি ইউনিয়নের সর্বাধিক (আন) জনপ্রিয় ব্যবহারের ক্ষেত্রে। আর একটি ব্যবহারের ক্ষেত্রে হ'ল যখন কোনও ইউনিয়নের উদাহরণ আসে এমন কিছু কিছু নিয়ে আসে যা আপনাকে এর ধরণটি বলে।
কেস 2 ব্যবহার করুন: "আপনার সাথে দেখা করে ভাল লাগছে object, আমি এসেছিClass "
ধরা যাক কোনও প্রোগ্রামার সর্বদা কোনও টাইপ বর্ণনাকারীর সাথে ইউনিয়নের উদাহরণ তৈরি করার জন্য নির্বাচিত হন (আমি এটি পাঠকের বিবেচনার ভিত্তিতে ছেড়ে দেব) এরকম একটি অবজেক্টের বাস্তবায়ন কল্পনা করার জন্য)। প্রোগ্রামার যা চায় তা মেমরি বাঁচাতে হয় এবং ইউনিয়নটির সাথে সম্পর্কিত ধরণের বর্ণনাকারীর আকার নগণ্য না হয় তবে এটি ইউনিয়নের উদ্দেশ্যকে হ্রাস করে। তবে ধরা যাক এটি অত্যন্ত গুরুত্বপূর্ণ যে ইউনিয়নটি একটি আর্গুমেন্ট হিসাবে বা কলি বা কলার ভিতরে যা আছে তা না জেনে রিটার্ন মান হিসাবে পাস হতে পারে।
তারপরে প্রোগ্রামারকে switchব্রুস ওয়েনকে কাঠের কাঠি বা সমতুল্য কিছু বাদ দিতে বলার জন্য একটি কন্ট্রোল ফ্লো স্টেটমেন্ট লিখতে হয় । এটি খুব খারাপ নয় যখন ইউনিয়নে কেবলমাত্র দুই ধরণের বিষয়বস্তু থাকে তবে স্পষ্টতই, ইউনিয়নটি আর স্কেল করে না।
কেস 3 ব্যবহার করুন:
আইএসও সি ++ স্ট্যান্ডার্ডের জন্য একটি সুপারিশের লেখক হিসাবে এটি 2008 সালে ফিরিয়ে দিয়েছে,
অনেকগুলি গুরুত্বপূর্ণ সমস্যা ডোমেনগুলির জন্য হয় প্রচুর পরিমাণে অবজেক্টস বা সীমিত মেমরির সংস্থান প্রয়োজন। এই পরিস্থিতিতে স্থান সংরক্ষণ খুব গুরুত্বপূর্ণ, এবং একটি ইউনিয়ন প্রায়শই এটি করার একটি সঠিক উপায়। প্রকৃতপক্ষে, একটি সাধারণ ব্যবহারের পরিস্থিতি এমন একটি পরিস্থিতি যেখানে ইউনিয়ন তার জীবদ্দশায় কখনও তার সক্রিয় সদস্যকে পরিবর্তন করে না। এটি নির্মাণ, অনুলিপি এবং ধ্বংসাত্মকভাবে তৈরি করা যেতে পারে যেন এটি কেবলমাত্র একটি সদস্যযুক্ত একটি কাঠামো। এর একটি সাধারণ অ্যাপ্লিকেশনটি হ'ল প্রাসঙ্গিক প্রকারের বৈচিত্র্যপূর্ণ সংগ্রহ তৈরি করা যা গতিসম্পন্নভাবে বরাদ্দ করা হয় না (সম্ভবত তারা কোনও মানচিত্রে নির্ধারিত জায়গায় বা কোনও অ্যারের সদস্য)।
এবং এখন, একটি ইউএমএল বর্গ ডায়াগ্রাম সহ একটি উদাহরণ:

প্লেইন ইংরেজি পরিস্থিতি: বর্গ একটি অবজেক্ট করতে খ 1 মধ্যে কোনো ক্লাসের বস্তু আছে, ... বিএন, এবং প্রতিটি ধরনের সর্বাধিক একটি সঙ্গে এ এন একটি প্রশংসনীয় বড় সংখ্যা হচ্ছে বলে অন্তত 10।
আমরা এর মতো ক্ষেত্রগুলি (ডেটা সদস্য) যুক্ত করতে চাই না:
private:
B1 b1;
.
.
.
Bn bn;
কারণ এন পৃথক হতে পারে (আমরা মিশ্রণে বিএক্স ক্লাস যুক্ত করতে চাই) এবং কারণ এটি নির্মাণকারীদের সাথে ঝামেলা সৃষ্টি করতে পারে এবং কারণ কোনও বস্তু প্রচুর স্থান গ্রহণ করবে।
আমরা তাদের পুনরুদ্ধারের জন্য কাস্টসযুক্ত বস্তুগুলিতে void*পয়েন্টারগুলির একটি কৌতুকপূর্ণ ধারক ব্যবহার করতে Bxপারি, তবে এটি পলক এবং তাই সি স্টাইল ... তবে আরও গুরুত্বপূর্ণ বিষয়টি আমাদের পরিচালনা করতে অনেক গতিশীল বরাদ্দকৃত অবজেক্টের লাইফটাইম ছেড়ে চলে যায়।
পরিবর্তে, যা করা যায় তা হ'ল:
union Bee
{
B1 b1;
.
.
.
Bn bn;
};
enum BeesTypes { TYPE_B1, ..., TYPE_BN };
class A
{
private:
std::unordered_map<int, Bee> data; // C++11, otherwise use std::map
public:
Bee get(int); // the implementation is obvious: get from the unordered map
};
তারপরে, ইউনিয়নের উদাহরণের বিষয়বস্তু পেতে data, আপনি ব্যবহার করেন a.get(TYPE_B2).b2এবং পছন্দগুলি করেন, যেখানে aকোনও শ্রেণীর Aউদাহরণ রয়েছে।
ইউনিয়নগুলি সি ++ 11 এ সীমাবদ্ধ না থাকায় এটি আরও শক্তিশালী। দেখুন ডকুমেন্ট উপরে লিঙ্ক বা এই নিবন্ধটি বিস্তারিত জানার জন্য।