বিটমাস্কগুলির জন্য এখানে একটি বিকল্প রয়েছে যদি আপনার যদি ব্যক্তিগত এনাম মানগুলির জন্য প্রকৃতপক্ষে ব্যবহার না করেন (উদাহরণস্বরূপ আপনার সেগুলি স্যুইচ করার দরকার নেই) ... এবং আপনি যদি বাইনারি সামঞ্জস্যতা বজায় রাখতে উদ্বিগ্ন না হন যেমন: আপনি আপনার বিটগুলি কোথায় থাকবেন তা চিন্তা করবেন না ... যা আপনি সম্ভবত আছেন। এছাড়াও আপনি স্কোপিং এবং অ্যাক্সেস নিয়ন্ত্রণের সাথে খুব বেশি উদ্বিগ্ন হবেন না। হুমম, এনামদের বিট-ফিল্ডগুলির জন্য কিছু দুর্দান্ত বৈশিষ্ট্য রয়েছে ... অবাক করে কেউ কেউ কখনও চেষ্টা করেছে কিনা :)
struct AnimalProperties
{
bool HasClaws : 1;
bool CanFly : 1;
bool EatsFish : 1;
bool Endangered : 1;
};
union AnimalDescription
{
AnimalProperties Properties;
int Flags;
};
void TestUnionFlags()
{
AnimalDescription propertiesA;
propertiesA.Properties.CanFly = true;
AnimalDescription propertiesB = propertiesA;
propertiesB.Properties.EatsFish = true;
if( propertiesA.Flags == propertiesB.Flags )
{
cout << "Life is terrible :(";
}
else
{
cout << "Life is great!";
}
AnimalDescription propertiesC = propertiesA;
if( propertiesA.Flags == propertiesC.Flags )
{
cout << "Life is great!";
}
else
{
cout << "Life is terrible :(";
}
}
আমরা দেখতে পাচ্ছি যে জীবন দুর্দান্ত, আমাদের আলাদা মূল্যবোধ রয়েছে এবং আমাদের কাছে & এবং | আমাদের হৃদয়ের বিষয়বস্তুতে, এর বিটগুলি কী বোঝায় তার প্রসঙ্গ এখনও রয়েছে। আমার কাছে সবকিছু সুসংগত এবং অনুমানযোগ্য ... যতক্ষণ না আমি উইন 10 এক্স 64 তে মাইক্রোসফ্টের ভিসি ++ সংকলক ডাব্লু / আপডেট 3 ব্যবহার করি এবং আমার সংকলক পতাকাগুলি স্পর্শ না করি :)
যদিও সবকিছু দুর্দান্ত ... আমাদের এখন পতাকার অর্থ সম্পর্কে কিছু প্রসঙ্গ আছে , যেহেতু এটি একটি ইউনিয়ন ডব্লিউ / বিটফিল্ডের মধ্যে রয়েছে ভয়ঙ্কর বাস্তব বিশ্বের যেখানে আপনার প্রোগ্রামটি একক বিচ্ছিন্ন কাজটির চেয়ে বেশি দায়বদ্ধ হতে পারে could এখনও দুর্ঘটনাক্রমে (বেশ সহজেই) বিভিন্ন ইউনিয়নের দুটি পতাকা ক্ষেত্র একসাথে ছিন্ন করা হয়েছে (বলুন, এনিমালপ্রপার্টি এবং অবজেক্টপ্রপি, যেহেতু তারা উভয় প্রকারের অন্তর্গত), আপনার সমস্ত বিটগুলি মিশ্রণ করুন, এটি হ'ল একটি ভয়ঙ্কর বাগ যা ... এবং আমি কীভাবে জানি এই পোস্টে অনেক লোক বিটমাস্ক দিয়ে খুব প্রায়শই কাজ করেন না, যেহেতু এগুলি তৈরি করা সহজ এবং এগুলি রক্ষণাবেক্ষণ করা শক্ত।
class AnimalDefinition {
public:
static AnimalDefinition *GetAnimalDefinition( AnimalFlags flags ); //A little too obvious for my taste... NEXT!
static AnimalDefinition *GetAnimalDefinition( AnimalProperties properties ); //Oh I see how to use this! BORING, NEXT!
static AnimalDefinition *GetAnimalDefinition( int flags ); //hmm, wish I could see how to construct a valid "flags" int without CrossFingers+Ctrl+Shift+F("Animal*"). Maybe just hard-code 16 or something?
AnimalFlags animalFlags; //Well this is *way* too hard to break unintentionally, screw this!
int flags; //PERFECT! Nothing will ever go wrong here...
//wait, what values are used for this particular flags field? Is this AnimalFlags or ObjectFlags? Or is it RuntimePlatformFlags? Does it matter? Where's the documentation?
//Well luckily anyone in the code base and get confused and destroy the whole program! At least I don't need to static_cast anymore, phew!
private:
AnimalDescription m_description; //Oh I know what this is. All of the mystery and excitement of life has been stolen away :(
}
সুতরাং আপনি "পতাকা" এ সরাসরি অ্যাক্সেস রোধ করতে আপনার ইউনিয়ন ঘোষণাকে বেসরকারী করে তোলেন, এবং গেটস / সেটটার এবং অপারেটর ওভারলোডগুলি যুক্ত করতে হবে, তারপরে সমস্ত কিছুর জন্য একটি ম্যাক্রো তৈরি করুন এবং আপনি মূলত ঠিক সেখানেই ফিরে এসেছিলেন যেখানে আপনি চেষ্টা করার সময় শুরু করেছিলেন একটি এনাম দিয়ে এটি করুন।
দুর্ভাগ্যক্রমে যদি আপনি চান যে আপনার কোডটি পোর্টেবল হতে পারে তবে আমি মনে করি না এ এর কোনও উপায় আছে) বিট লেআউটের গ্যারান্টি বা বি) সংকলনের সময় বিট লেআউট নির্ধারণ করুন (যাতে আপনি এটি ট্র্যাক করতে পারেন এবং কমপক্ষে পরিবর্তনের জন্য কমপক্ষে সঠিক করতে পারেন) সংস্করণ / প্ল্যাটফর্ম ইত্যাদি)
বিট ক্ষেত্র সহ কোনও স্ট্রাক্টে অফসেট
রানটাইমের সময় আপনি কৌতুক খেলতে পারেন / ক্ষেত্রগুলি নির্ধারণ করতে এবং পতাকাগুলিতে কী কী বিটগুলি পরিবর্তন হয়েছে তা Xoring দেখতে আমার কাছে অত্যন্ত কৃপণ মনে হয় যদিও শ্লোকে 100% ধারাবাহিক, প্ল্যাটফর্মটি স্বাধীন এবং সম্পূর্ণরূপে নির্বিচার সমাধান রয়েছে যেমন: একটি ENUM।
টিএল; ডিআর: শত্রুদের কথা শুনবেন না। সি ++ ইংরেজি নয়। কেবলমাত্র সি থেকে উত্তরাধিকার সূত্রে সংক্ষিপ্ত কীওয়ার্ডের আক্ষরিক সংজ্ঞা আপনার ব্যবহারের সাথে খাপ খায় না তার অর্থ এই নয় যে কীওয়ার্ডের সি এবং সি ++ সংজ্ঞা একেবারে আপনার ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত থাকে তখন আপনি এটি ব্যবহার করবেন না। আপনি স্ট্রাকচার ব্যতীত অন্যান্য জিনিসগুলির মডেল করার জন্য স্ট্রাক্ট এবং স্কুল এবং সামাজিক বর্ণ বাদে অন্য কোনও জিনিসের জন্য ক্লাসও ব্যবহার করতে পারেন। ভিত্তিযুক্ত মানগুলির জন্য আপনি ভাসা ব্যবহার করতে পারেন। আপনি ভেরিয়েবলগুলির জন্য চর ব্যবহার করতে পারেন যা না পোড়াও নয়, কোনও উপন্যাস, নাটক বা চলচ্চিত্রের কোনও ব্যক্তি। যে কোনও প্রোগ্রামার ভাষার অভিধানের আগে কোনও কীওয়ার্ডের অর্থ নির্ধারণ করতে অভিধানে যান ... ভাল, আমি আমার জিহ্বাকে সেখানে ধরে রাখব।
যদি আপনি কথ্য ভাষার পরে আপনার কোড মডেল করতে চান তবে আপনি উদ্দেশ্যমূলক-সি-তে লেখার পক্ষে সেরা হবেন, যা ঘটনাক্রমে বিটফিল্ডের জন্য এনামগুলিকেও প্রচুর পরিমাণে ব্যবহার করে।
[Flags]
এট্রিবিউটটি ঠিক ঠিক কাজ করে যেমন:[Flags] enum class FlagBits{ Ready = 1, ReadMode = 2, WriteMode = 4, EOF = 8, Disabled = 16};