শ্রেণীর স্ট্যাটিক ভেরিয়েবলগুলি শিরোনামে ঘোষিত হতে পারে তবে একটি .cpp ফাইলে সংজ্ঞায়িত করতে হবে । এটি কারণ এটি একটি স্থিতিশীল ভেরিয়েবলের কেবলমাত্র একটি উদাহরণ থাকতে পারে এবং সংকলক সিদ্ধান্ত নিতে পারে না যে কোন উত্পন্ন ফাইলটিকে এটি রাখা উচিত যাতে পরিবর্তে আপনাকে সিদ্ধান্ত নিতে হবে।
সি ++ 11 এ ঘোষণার সাথে একটি স্থির মানের সংজ্ঞা রাখতে একটি নেস্টেড স্ট্যাটিক কাঠামো ব্যবহার করা যেতে পারে। এই ক্ষেত্রে স্থির সদস্যটি একটি কাঠামো এবং একটি .cpp ফাইলে সংজ্ঞায়িত করতে হয়, তবে মানগুলি শিরোনামে থাকে।
class A
{
private:
static struct _Shapes {
const std::string RECTANGLE {"rectangle"};
const std::string CIRCLE {"circle"};
} shape;
};
পৃথক সদস্যদের সূচনা করার পরিবর্তে সম্পূর্ণ স্ট্যাটিক কাঠামোটি .cpp এ শুরু করা হয়:
A::_Shapes A::shape;
মানগুলি অ্যাক্সেস করা হয়
A::shape.RECTANGLE;
বা - যেহেতু সদস্যগুলি ব্যক্তিগত হয় এবং কেবল এ থেকে - ব্যবহার করে বোঝানো হয়
shape.RECTANGLE;
নোট করুন যে এই সমাধানটি এখনও স্ট্যাটিক ভেরিয়েবলগুলির আরম্ভের ক্রমটির সমস্যায় ভুগছে। যখন কোনও স্ট্যাটিক মান অন্য স্ট্যাটিক ভেরিয়েবলটি সূচনা করতে ব্যবহৃত হয়, তখন প্রথমটি আরম্ভ করা হতে পারে না, তবুও।
// file.h
class File {
public:
static struct _Extensions {
const std::string h{ ".h" };
const std::string hpp{ ".hpp" };
const std::string c{ ".c" };
const std::string cpp{ ".cpp" };
} extension;
};
// file.cpp
File::_Extensions File::extension;
// module.cpp
static std::set<std::string> headers{ File::extension.h, File::extension.hpp };
এই ক্ষেত্রে স্ট্যাটিক ভ্যারিয়েবল শিরোনামগুলি লিংকের দ্বারা তৈরি সূচনার ক্রমের উপর নির্ভর করে either ""} বা {".h", ".hpp" either হয় থাকবে।
@ অ্যাবিস by দ্বারা উল্লিখিত হিসাবে আপনি constexpr
ভেরিয়েবলের মানটি সংকলন সময়ে গণনা করা যায় তবে আপনি এটিও ব্যবহার করতে পারেন। তবে আপনি যদি আপনার স্ট্রিংগুলি static constexpr const char*
এবং আপনার প্রোগ্রামের ব্যবহারগুলি ঘোষণা করেনstd::string
অন্যথায় একটি ওভারহেড হবে কারণ std::string
আপনি যখনই এই ধ্রুবকটি ব্যবহার করেন তখনই একটি নতুন অবজেক্ট তৈরি হবে:
class A {
public:
static constexpr const char* STRING = "some value";
};
void foo(const std::string& bar);
int main() {
foo(A::STRING); // a new std::string is constructed and destroyed.
}