সি ++ তে একটি "নেমস্পেসের নাম" কী? এটি কীভাবে ব্যবহৃত হয়?
সি ++ তে একটি "নেমস্পেসের নাম" কী? এটি কীভাবে ব্যবহৃত হয়?
উত্তর:
একটি নেমস্পেসের নামটি একটি দীর্ঘ, ছোট নাম দ্বারা আলাদা, সংক্ষিপ্ত নামের সাথে উল্লেখ করার একটি সুবিধাজনক উপায়।
উদাহরণস্বরূপ, বলুন যে আপনি কোনও using namespace
নির্দেশ ছাড়াই বুস্টের ইউব্ল্যাএলএস থেকে সংখ্যক ভেক্টর ব্যবহার করতে চেয়েছিলেন । প্রতিবার পুরো নেমস্পেসটি উল্লেখ করা জটিল:
boost::numeric::ublas::vector<double> v;
পরিবর্তে, আপনি এর জন্য একটি নাম নির্ধারণ করতে পারেন boost::numeric::ublas
- বলুন আমরা এটি সংক্ষিপ্ত করতে চাই ublas
:
namespace ublas = boost::numeric::ublas;
ublas::vector<double> v;
একদম সহজ, # সংজ্ঞাটি কাজ করবে না।
namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }
জরিমানা সংকলন। আপনাকে নেমস্পেস / শ্রেণির নামের সংঘাতের চারপাশে কাজ করতে দেয়।
namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }
শেষ লাইনে, "হুঁ: ওফস" একটি সংকলন ত্রুটি। প্রাক-প্রসেসর এটিকে নপ :: ওপস এ পরিবর্তন করে, তবে নোপ ইতিমধ্যে একটি শ্রেণীর নাম।
এই বিষয়ে আরো http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n
লুং নেমস্পেসের নামের জন্য এটি একটি নাম নির্বাচন করা যেমন:
namespace SHORT = NamespaceFirst::NameSpaceNested::Meow
তারপরে, আপনি টাইপডেফ করতে পারেন
typedef SHORT::mytype
পরিবর্তে
typedef NamespaceFirst::NameSpaceNested::Meow::mytype
এই বাক্য গঠনটি কেবল নামস্থানগুলির জন্য কাজ করে, ক্লাস, প্রকারের পরে অন্তর্ভুক্ত করতে পারে না namespace NAME =
এছাড়াও নোটস্পেসের এলিয়াস এবং নির্দেশাবলী ব্যবহারের সময় সমাধান নয়, সংকলন সময়ে সমাধান করা হয় তা নোট করুন। (আরও সুনির্দিষ্টভাবে বলা যায় যে, নামগুলি সমাধান করার সময় তারা কোথায় দেখতে হবে সেগুলি উভয়ই সংকলককে বলেছিল, যদি এটি বর্তমান স্কোপ বা এর কোনও প্যারেন্ট স্কোপের কোনও নির্দিষ্ট চিহ্ন খুঁজে না পায়)) উদাহরণস্বরূপ, এগুলির কোনওটিই কম্পাইল:
namespace A {
int foo;
namespace AA {
int bar;
} // namespace AA
namespace AB {
int bar;
} // namespace AB
} // namespace A
namespace B {
int foo;
namespace BA {
int bar;
} // namespace BA
namespace BB {
int bar;
} // namespace BB
} // namespace B
bool nsChooser1, nsChooser2;
// ...
// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;
// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
if (nsChooser2)
using namespace A::AA;
else
using namespace A::AB;
else
if (nsChooser2)
using namespace B::BA;
else
using namespace B::BB;
এখন, একটি কৌতূহলী মন লক্ষ্য করতে পারে যে constexpr
সংকলনের সময় চলকগুলিও ব্যবহৃত হয় এবং অবাক হয় যে এগুলি কোনও উপন্যাস বা নির্দেশের সাথে ব্যবহার করা যেতে পারে। আমার জানা মতে, তারা পারবে না, যদিও আমি এই সম্পর্কে ভুল হতে পারি। আপনার যদি বিভিন্ন নাম স্থানগুলিতে স্বতন্ত্র-নামযুক্ত ভেরিয়েবলগুলির সাথে কাজ করার প্রয়োজন হয় এবং এগুলির মধ্যে গতিশীলভাবে চয়ন করতে চান তবে আপনাকে রেফারেন্স বা পয়েন্টার ব্যবহার করতে হবে।
// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);
int* bar;
if (nsChooser1) {
if (nsChooser2) {
bar = &A::AA::bar;
} else {
bar = &A::AB::bar;
}
} else {
if (nsChooser2) {
bar = &B::BA::bar;
} else {
bar = &B::BB::bar;
}
}
উপরের উপযোগিতা সীমিত হতে পারে তবে এটি উদ্দেশ্যটি পরিবেশন করা উচিত।
(উপরের যে কোনও টাইপটি আমি মিস করেছি তার জন্য আমার ক্ষমা প্রার্থনা)
নামের দ্বন্দ্ব রোধ করতে নেমস্পেস ব্যবহার করা হয়।
উদাহরণ স্বরূপ:
namespace foo {
class bar {
//define it
};
}
namespace baz {
class bar {
// define it
};
}
আপনার কাছে এখন দুটি ক্লাসের নেম বার রয়েছে যা সম্পূর্ণ আলাদা এবং নেমস্পেসিংয়ের জন্য পৃথক ধন্যবাদ।
আপনি যে "নেমস্পেসটি ব্যবহার করছেন" তা হ'ল যাতে আপনাকে সেই নেমস্পেসের মধ্যে ক্লাসগুলি ব্যবহার করার জন্য নেমস্পেস নির্দিষ্ট করতে হবে না। যেমন স্টাড :: স্ট্রিং স্ট্রিং হয়ে যায়।
আমার সংস্থান: https://www.quora.com/What-is-namespace-in-C++-1