আপনি কীভাবে সি ++ তে নামস্থান সঠিকভাবে ব্যবহার করবেন?


231

আমি জাভা ব্যাকগ্রাউন্ড থেকে এসেছি, যেখানে প্যাকেজগুলি ব্যবহার করা হয়, নেমস্পেসগুলি নয়। আমি ক্লাসগুলি স্থাপন করতে অভ্যস্ত যা প্যাকেজগুলিতে সম্পূর্ণ অবজেক্ট তৈরি করতে একসাথে কাজ করে এবং তারপরে সেই প্যাকেজটি থেকে পরে তাদের পুনরায় ব্যবহার করি। তবে এখন আমি সি ++ এ কাজ করছি।

আপনি সি ++ তে নামস্থান কীভাবে ব্যবহার করবেন? আপনি কি পুরো অ্যাপ্লিকেশনটির জন্য একটি একক নেমস্পেস তৈরি করেন, বা আপনি প্রধান উপাদানগুলির জন্য নেমস্পেস তৈরি করেন? যদি তা হয় তবে অন্যান্য নামস্থানগুলিতে ক্লাস থেকে আপনি কীভাবে বস্তু তৈরি করবেন?

উত্তর:


167

নেমস্পেসগুলি মূলত প্যাকেজগুলি। এগুলি ব্যবহার করা যেতে পারে:

namespace MyNamespace
{
  class MyClass
  {
  };
}

তারপরে কোডে:

MyNamespace::MyClass* pClass = new MyNamespace::MyClass();

অথবা, আপনি যদি সর্বদা একটি নির্দিষ্ট নেমস্পেস ব্যবহার করতে চান তবে আপনি এটি করতে পারেন:

using namespace MyNamespace;

MyClass* pClass = new MyClass();

সম্পাদনা: বার্নহারড্রেছ যা বলেছে তার অনুসরণ করে আমি "নেমস্পেস এক্স ব্যবহার করে" সিনট্যাক্সটি মোটেও ব্যবহার করার প্রবণতা রাখি না, আমি সাধারণত আমার অবজেক্টগুলিকে ইনস্ট্যান্ট করার সময় নাম স্পেস স্পষ্টভাবে নির্দিষ্ট করে (যেমন আমি প্রথম উদাহরণটি দেখিয়েছি)।

এবং আপনি নীচে যেমন জিজ্ঞাসা করেছেন , আপনি নিজের পছন্দমতো নেমস্পেস ব্যবহার করতে পারেন।


25
আইএমও কেবলমাত্র stdনাম ব্যবহারের পরিবর্তে প্রতীকগুলিতে উপসর্গ করা অভ্যাস usingকরা ভাল। তাই আমি সবসময় লিখি std::coutবা std::stringএখনই কারণ এটাই আমি তাদের এখন ডাকছি। আমি শুধু লিখতে হবে না cout
টম সেভেজ

5
যদিও এটি খুব সত্য std, আপনি ব্যক্তিগত লাইব্রেরিগুলি ব্যবহার করার সময় আমি ব্যক্তিগতভাবে এটি অনেক কম গুরুত্বপূর্ণ পেয়েছি। প্রায়শই আপনি কেবল ব্যবহার করতে পারেন using namespace FooBario;, বিশেষত যদি আপনি কোনও গ্রন্থাগার থেকে প্রচুর পরিমাণে ব্যবহার করেন using
জেকেরিয়ান

4
@ জাকারিয়ান, আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, তবে আমি একমত নই কারণ নামের সংঘর্ষগুলি (মনে মনে) এই জাতীয় ছোট লাইব্রেরি থেকে সম্ভবত আসে likely বেশিরভাগ মানুষ ক্লাস / ফাংশনগুলির নাম এসটিএল-এর মতো না রাখার বিষয়ে সতর্ক হন। এটি বলেছিল, আমি সম্মত হই যে using namespace X;সম্ভব হলে হেডার ফাইলগুলিতে এড়ানো উচিত।
অ্যালান টুরিং

12
@ লেক্সফ্রিডম্যান "বেশিরভাগ মানুষ ক্লাস / ফাংশনগুলির নাম এসটিএল-এর মতো না রাখার বিষয়ে সতর্ক হন" - এটি সত্য নয়। উদাহরণস্বরূপ যদি আমি কিছু অদ্ভুত হার্ডওয়ারের জন্য কিছু বিশেষায়িত I / O কোড লিখি তবে আমি mylibrary::endlনিজের বিশেষ নিজস্ব নিউলাইন ক্রমটি উপস্থাপন করা ছাড়া আর কখনও কিছুই ব্যবহার করতাম না। মানে, নাম কেন আবিষ্কার?

যদিও আমি স্পষ্টভাবে এটি নির্দিষ্ট করতে চাই এবং যেখানে ফাইলটি ঘোষিত হয়েছে সেখানে আমি অন্তর্ভুক্ত করি তারপরেও আমার সংকলকটি নাম স্থানটি চিনতে পারবে না।
বিজেঞ্চেল

116

সবকিছু না বলা এড়াতে মার্ক ইঙ্গ্রাম নেমস্পেসগুলি ব্যবহার করার জন্য ইতিমধ্যে কিছুটা পরামর্শ বলেছিলেন:

শিরোলেখ ফাইলগুলিতে "নেমস্পেস ব্যবহার করে" নির্দেশনা এড়ান - এটি প্রোগ্রামের সমস্ত অংশের জন্য নামস্থানটি খোলে যা এই শিরোলেখ ফাইলটি আমদানি করে। প্রয়োগকারী ফাইলগুলিতে (* .cpp) এটি সাধারণত কোনও বড় সমস্যা হয় না - পর্যাপ্ত পরিমাণে আমি ফাংশন স্তরে "নেমস্পেস ব্যবহার করে" নির্দেশিকা ব্যবহার করতে পছন্দ করি।

আমি মনে করি নেমস্পেসগুলি বেশিরভাগ নামকরণ বিরোধগুলি এড়াতে ব্যবহৃত হয় - আপনার কোড কাঠামোটি সাজানোর জন্য অগত্যা নয়। আমি সি ++ প্রোগ্রামগুলি প্রধানত হেডার ফাইলগুলি / ফাইলের কাঠামোর সাথে সংগঠিত করতাম।

কখনও কখনও প্রয়োগের বিশদটি গোপন করার জন্য নেমস্পেসগুলি বড় সি ++ প্রকল্পে ব্যবহৃত হয়।

ব্যবহার নির্দেশের অতিরিক্ত নোট: কিছু লোক কেবলমাত্র একক উপাদানের জন্য "ব্যবহার" ব্যবহার পছন্দ করেন:

using std::cout;  
using std::endl;

2
আপনি .cpp ফাইল স্তর বা .cpp মধ্যে নেমস্পেস}} ব্লক স্তরের চেয়ে ফাংশন স্তরে "নেমস্পেস ব্যবহার" এর একটি সুবিধা হ'ল এটি একক সংকলন-ইউনিট বিল্ডগুলির সাথে ব্যাপকভাবে সহায়তা করে। "নেমস্পেস ব্যবহার করা" ট্রানজিটিভ, এবং একই ইউনিটের স্বতন্ত্র নেমস্পেস এ}} ব্লক জুড়ে নেমস্পেস এটির জন্য প্রযোজ্য, সুতরাং একক-সংকলন-ইউনিটের জন্য আপনি ফাইল বা নেমস্পেস ব্লক স্তরে সম্পন্ন করা হলে আপনি সবকিছু ব্যবহার করে দ্রুত শেষ করেন।
idij


3
একক বিবৃতিতে কোনও একক নামস্থান থেকে একাধিক নাম ব্যবহার করা কি সম্ভব ? কিছু মত বা এমনকি । using std::cout, std::endl;using std::cout, endl;
AlQuemist

using namespace xকোনও শিরোনামে এটি অন্য নামের জায়গার মধ্যে থাকলে এটি ব্যবহার করা ঠিক হবে। এটি আমি সাধারণভাবে সুপারিশ করব এমন কিছু নয় তবে এটি বিশ্বব্যাপী নেমস্পেসকে দূষিত করে না।
প্রেক্সোলাইটিক

79

ভিনসেন্ট রবার্ট তার মন্তব্যে ঠিক বলেছেন আপনি সি ++ তে নামস্থান কীভাবে ব্যবহার করবেন?

নেমস্পেস ব্যবহার করা

নামের সংঘাত এড়াতে সহায়তার জন্য নেমস্পেসগুলি খুব কম ব্যবহার করা হয়। জাভাতে, এটি "org.domain" আইডিয়মের মাধ্যমে প্রয়োগ করা হয় (কারণ এটির নিজের ডোমেন নাম বাদে অন্য কিছু ব্যবহার করা হবে না বলে ধারণা করা হয়)।

সি ++ এ আপনি আপনার মডিউলের সমস্ত কোডকে একটি নেমস্পেস দিতে পারেন। উদাহরণস্বরূপ, মডিউল MyModule.dll মডিউলটির জন্য, আপনি এর কোডটিকে নাম স্থান মাইমোডুল দিতে পারেন। আমি অন্য কোথাও মাইকম্পানি :: মাইপ্রজেক্ট :: মাইমডুল ব্যবহার করে দেখেছি। আমি অনুমান করি যে এটি অত্যধিক দক্ষ, তবে সর্বোপরি এটি আমার কাছে সঠিক বলে মনে হচ্ছে।

"ব্যবহার করে" ব্যবহার করা হচ্ছে

ব্যবহারটি অত্যন্ত যত্ন সহকারে ব্যবহার করা উচিত কারণ এটি কার্যকরভাবে আপনার বর্তমান নেমস্পেসে একটি নেমস্পেস থেকে একটি (বা সমস্ত) প্রতীক আমদানি করে।

এটি একটি হেডার ফাইলটিতে করা খারাপ কারণ আপনার শিরোনাম এটি সহ প্রতিটি উত্সকে দূষিত করে দেবে (এটি আমাকে ম্যাক্রোর ... remind নাম স্থান থেকে প্রতীক।

"ব্যবহার করে" ব্যবহারের সর্বাধিক সুরক্ষিত উপায় হল নির্বাচিত প্রতীকগুলি আমদানি করা:

void doSomething()
{
   using std::string ; // string is now "imported", at least,
                       // until the end of the function
   string a("Hello World!") ;
   std::cout << a << std::endl ;
}

void doSomethingElse()
{
   using namespace std ; // everything from std is now "imported", at least,
                       // until the end of the function
   string a("Hello World!") ;
   cout << a << endl ;
}

আপনি "নেমস্পেস স্ট্যান্ড ব্যবহার করে অনেকগুলি" দেখতে পাবেন; টিউটোরিয়াল বা উদাহরণ কোডগুলিতে। পড়াটি সহজ করার জন্য প্রতীক সংখ্যা হ্রাস করার কারণ এটি নয় কারণ এটি একটি ভাল ধারণা।

"নেমস্পেস স্ট্যান্ড ব্যবহার করে;" স্কট মায়ার্স দ্বারা নিরুৎসাহিত হয়েছেন (কোন বইটি ঠিক মনে নেই, তবে প্রয়োজনে এটি খুঁজে পেতে পারি)।

নেমস্পেস কম্পোজিশন

নেমস্পেসগুলি প্যাকেজের চেয়ে বেশি। আর একটি উদাহরণ পাওয়া যায় বার্জন স্ট্রস্ট্রপের "দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজে"।

"স্পেশাল এডিশন" এ, 8.2.8 নেমস্পেস কম্পোজিশনে , তিনি বর্ণনা করেছেন যে আপনি কীভাবে দুটি নামস্থান এএএ এবং বিবিবিকে সিসিসি নামক একটিতে যুক্ত করতে পারেন। সুতরাং সিসিসি এএএ এবং বিবিবি উভয়েরই একটি নাম হয়ে যায়:

namespace AAA
{
   void doSomething() ;
}

namespace BBB
{
   void doSomethingElse() ;
}

namespace CCC
{
   using namespace AAA ;
   using namespace BBB ;
}

void doSomethingAgain()
{
   CCC::doSomething() ;
   CCC::doSomethingElse() ;
}

এমনকি নিজস্ব কাস্টম নেমস্পেস ইন্টারফেসটি তৈরি করতে আপনি বিভিন্ন নেমস্পেসগুলি থেকে নির্বাচিত চিহ্নগুলি আমদানি করতে পারেন। আমি এখনও এর ব্যবহারিক ব্যবহার খুঁজে পাইনি, তবে তত্ত্বের দিক থেকে এটি দুর্দান্ত।


আপনি কি স্পষ্ট করতে পারেন, দয়া করে "আপনার মডিউলের সমস্ত কোডের একটি নাম স্থান দিন"? মডিউল আবদ্ধ করতে ভাল অনুশীলন কি। উদাহরণস্বরূপ আমার জটিল সংখ্যার ক্লাস এবং জটিল সংখ্যার সাথে সম্পর্কিত বহিরাগত ফাংশন রয়েছে। এই শ্রেণি এবং এই দুটি ফাংশন এক নাম জায়গায় থাকা উচিত?
ইয়ানপাস

74

অন্যান্য উত্তরে আমি এর কোনও উল্লেখ দেখতে পাইনি, সুতরাং আমার 2 কানাডিয়ান সেন্ট এখানে রয়েছে:

"নেমস্পেস ব্যবহার করে" বিষয়ে, একটি দরকারী বিবৃতি হ'ল নেমস্পেস ওরফে, যা আপনাকে সাধারণত একটি ছোট নাম দেওয়ার জন্য একটি নাম স্থান "নামকরণ" করতে দেয়। উদাহরণস্বরূপ, পরিবর্তে:

Some::Impossibly::Annoyingly::Long:Name::For::Namespace::Finally::TheClassName foo;
Some::Impossibly::Annoyingly::Long:Name::For::Namespace::Finally::AnotherClassName bar;

তুমি লিখতে পারো:

namespace Shorter = Some::Impossibly::Annoyingly::Long:Name::For::Namespace::Finally;
Shorter::TheClassName foo;
Shorter::AnotherClassName bar;

55

প্রত্যেকটি লোকের কাছে শুনবেন না যে নাম স্থানগুলি কেবল নাম-স্থান।

সেগুলি গুরুত্বপূর্ণ কারণ এগুলি ইন্টারফেস নীতিটি প্রয়োগ করতে সংকলক দ্বারা বিবেচিত হয়। মূলত, এটি একটি উদাহরণ দ্বারা ব্যাখ্যা করা যেতে পারে:

namespace ns {

class A
{
};

void print(A a)
{
}

}

আপনি যদি কোনও কোনও বস্তু মুদ্রণ করতে চান, কোডটি এটির জন্য হবে:

ns::A a;
print(a);

দ্রষ্টব্য যে ফাংশনটি কল করার সময় আমরা স্পষ্টভাবে নেমস্পেসের উল্লেখ করি নি। এটি ইন্টারফেসের নীতি: সি ++ একটি প্রকারকে এই ধরণের ইন্টারফেসের অংশ হিসাবে আর্গুমেন্ট হিসাবে গ্রহণ করে এমন কোনও ফাংশন বিবেচনা করে, তাই নাম স্থান নির্দিষ্ট করার প্রয়োজন নেই কারণ প্যারামিটারটি ইতিমধ্যে নেমস্পেসকে বোঝায়।

এখন কেন এই নীতিটি গুরুত্বপূর্ণ? ভাবুন যে ক্লাস এ লেখক এই শ্রেণীর জন্য একটি মুদ্রণ () ফাংশন সরবরাহ করেন নি। আপনাকে নিজের একটি সরবরাহ করতে হবে। আপনি যেহেতু একজন ভাল প্রোগ্রামার, আপনি এই ফাংশনটি আপনার নিজের নামস্থানে বা বিশ্বব্যাপী নেমস্পেসে সংজ্ঞায়িত করবেন।

namespace ns {

class A
{
};

}

void print(A a)
{
}

এবং আপনার কোড আপনি যেখানেই চান মুদ্রণ (ক) ফাংশন কল করতে শুরু করতে পারে। এখন ভেবে দেখুন যে বছরগুলি পরে, লেখক আপনার চেয়ে ভাল একটি মুদ্রণ () ফাংশন সরবরাহ করার সিদ্ধান্ত নেন কারণ তিনি তাঁর শ্রেণীর অভ্যন্তরীণ জানেন এবং আপনার চেয়ে আরও ভাল সংস্করণ তৈরি করতে পারেন।

তারপরে সি ++ লেখকরা সিদ্ধান্ত নিয়েছিলেন যে তার মুদ্রণ () ফাংশনের সংস্করণটি ইন্টারফেসের নীতিটি শ্রদ্ধার জন্য অন্য নামস্থানে সরবরাহ করা পরিবর্তে ব্যবহার করা উচিত। এবং মুদ্রণের () ফাংশনের এই "আপগ্রেড "টি যথাসম্ভব সহজ হওয়া উচিত, যার অর্থ আপনার প্রতিটি কল মুদ্রণ () ফাংশনে পরিবর্তন করতে হবে না। এজন্য সি ++ এ নামস্থান নির্দিষ্ট না করেই "ইন্টারফেস ফাংশন" (একটি শ্রেণীর মতো একই নেমস্পেসে ফাংশন) বলা যেতে পারে।

এবং এজন্য আপনি যখন একটি ব্যবহার করেন এবং ইন্টারফেসের নীতিটি মাথায় রাখেন তখন আপনাকে একটি সি ++ নেমস্পেসকে "ইন্টারফেস" হিসাবে বিবেচনা করা উচিত।

আপনি যদি এই আচরণের আরও ভাল ব্যাখ্যা চান, তবে আপনি হার্ব সটারের এক্সেক্সশনাল সি ++ বইটি উল্লেখ করতে পারেন


23
এনএস :: প্রিন্ট যোগ করা থাকলে আপনাকে প্রকৃতপক্ষে প্রতিটি কল মুদ্রণ () এ পরিবর্তন করতে হবে তবে সংকলকটি প্রতিটি কলকে দ্ব্যর্থক হিসাবে চিহ্নিত করবে। নিঃশব্দে নতুন ফাংশনে স্যুইচ করা ভয়ঙ্কর ধারণা হবে।
অন্ধকার

আমি এখন অবাক হয়ে যাচ্ছি, @ ভিনসেন্ট যা বলেছে তা আপনাকে মুদ্রণের জন্য সমস্ত কল পরিবর্তন করতে হবে, যদি অটোর এনএস :: মুদ্রণ () ফাংশন সরবরাহ করে, আপনি কী বলার চেষ্টা করছেন? যে যখন লেখক একটি এনএস :: মুদ্রণ () ফাংশন যুক্ত করেছেন, আপনি কেবল নিজের বাস্তবায়ন সরাতে পারবেন? অথবা আপনি কেবল এনএস :: মুদ্রণ ()-ডিক্লোরেশন ব্যবহার করে যুক্ত করবেন? নাকি অন্য কিছু? ধন্যবাদ
ভাসকা এল গাটো

36

বড় সি ++ প্রকল্পগুলি আমি একাধিক নেমস্পেস (উদাহরণস্বরূপ বুস্ট লাইব্রেরি) খুব কমই ব্যবহার করেছি।

প্রকৃতপক্ষে বুস্টের অনেকগুলি নামস্থান ব্যবহার করা হয়, সাধারণত বুস্টের প্রতিটি অংশের অভ্যন্তরীণ কাজের জন্য নিজস্ব নামস্থান থাকে এবং তারপরে কেবলমাত্র শীর্ষ-স্তরের নেমস্পেস বুস্টে পাবলিক ইন্টারফেস রাখতে পারে।

ব্যক্তিগতভাবে আমি মনে করি যে কোড-বেস যত বড় হবে তত বেশি গুরুত্বপূর্ণ নেমস্পেস হয়ে উঠবে, এমনকি একক অ্যাপ্লিকেশন (বা গ্রন্থাগার) এর মধ্যেও। কর্মক্ষেত্রে আমরা আমাদের অ্যাপ্লিকেশনটির প্রতিটি মডিউলটিকে তার নিজস্ব নামের জায়গায় রেখেছি।

নেমস্পেসের যা আমি অনেক বেশি ব্যবহার করি তার অপর একটি ব্যবহার (কোনও শোধিত উদ্দেশ্য নয়) হ'ল অজ্ঞাতনামা নামস্থান:

namespace {
  const int CONSTANT = 42;
}

এটি মূলত:

static const int CONSTANT = 42;

বেনামে নামস্থান ব্যবহার (স্ট্যাটিকের পরিবর্তে) তবে কোড এবং ডেটা কেবলমাত্র C ++ তে বর্তমান সংকলনের ইউনিটের মধ্যে দৃশ্যমান হওয়ার জন্য প্রস্তাবিত উপায়।


13
আপনার উভয় উদাহরণের সমতুল্য const int CONSTANT = 42;কারণ একটি নেমস্পেস স্কোপে শীর্ষ স্তরের কনস্ট ইতিমধ্যে অভ্যন্তরীণ লিঙ্কেজকে বোঝায়। সুতরাং আপনার এই ক্ষেত্রে বেনামে নেমস্পেসের দরকার নেই।
বিক্রয়

19

এছাড়াও, নোট করুন যে আপনি একটি নেমস্পেস যুক্ত করতে পারেন। এটি একটি উদাহরণ সহ পরিষ্কার হয়, আমার অর্থ হ'ল আপনি থাকতে পারেন:

namespace MyNamespace
{
    double square(double x) { return x * x; }
}

একটি ফাইল square.h, এবং

namespace MyNamespace
{
    double cube(double x) { return x * x * x; }
}

একটি ফাইলে cube.h। এটি একটি একক নেমস্পেসকে সংজ্ঞায়িত করে MyNamespace(যা আপনি একাধিক ফাইল জুড়ে একটি একক নেমস্পেস সংজ্ঞায়িত করতে পারেন)।


11

জাভাতে:

package somepackage;
class SomeClass {}

সি ++ এ:

namespace somenamespace {
    class SomeClass {}
}

এবং তাদের ব্যবহার করে, জাভা:

import somepackage;

এবং সি ++:

using namespace somenamespace;

এছাড়াও, পুরো নামগুলি জাভার জন্য "সাম্প্যাকজ.সোমক্লাস" এবং সি ++ এর জন্য "কিছু নামস্থান: সামারক্লাস"। এই কনভেনশনগুলি ব্যবহার করে, আপনি জাভাতে যেমন ব্যবহার করতে চান তেমন সংগঠিত করতে পারেন, নামের জায়গাগুলির সাথে মিলে ফোল্ডারের নাম তৈরি করা। ফোল্ডার-> প্যাকেজ এবং ফাইল-> শ্রেণীর প্রয়োজনীয়তা যদিও সেখানে নেই, তাই আপনি আপনার ফোল্ডার এবং ক্লাসের নাম স্বাধীনভাবে প্যাকেজ এবং নেমস্পেসের বাইরে রাখতে পারেন।


6

@ মারিয়াস

হ্যাঁ, আপনি একসাথে বেশ কয়েকটি নেমস্পেস ব্যবহার করতে পারেন, যেমন:

using namespace boost;   
using namespace std;  

shared_ptr<int> p(new int(1));   // shared_ptr belongs to boost   
cout << "cout belongs to std::" << endl;   // cout and endl are in std

[ফ ২০১৪ - (এটি কি এত দিন হয়েছে?): জোয়ের নীচে উল্লেখ করা হিসাবে এই বিশেষ উদাহরণটি এখন অস্পষ্ট। বুস্ট এবং স্ট্যান্ড :: এখন প্রত্যেকেরই একটি শেয়ার_পিটার রয়েছে]]


2
লক্ষ্য করুন stdএছাড়াও আছে shared_ptrএখন দ্বারা, তাই উভয় ব্যবহার boostএবং stdযখন আপনি একটি ব্যবহারের চেষ্টা নামব্যবধান সংঘর্ষ হবে shared_ptr
জোয়

2
এটি কেন অনেক সফ্টওয়্যার হাউস পুরো নামস্থান এইভাবে আমদানি করতে নিরুৎসাহিত করবে তার একটি উত্তম উদাহরণ। সর্বদা নেমস্পেসটি নির্দিষ্ট করে দেওয়া ক্ষতি করে না এবং যদি তারা খুব দীর্ঘ হয় তবে নাম স্থান থেকে একটি উপ নাম বা কেবলমাত্র গুরুত্বপূর্ণ নির্দিষ্ট ক্লাস তৈরি করা হয়।
ধান

5

আপনি উদাহরণস্বরূপ কোনও ফাংশনের অভ্যন্তরে "নেমস্পেস ব্যবহার করে ..." রাখতে পারেন:

void test(const std::string& s) {
    using namespace std;
    cout << s;
}

3

সাধারণভাবে বলতে গেলে আমি কোডের একটি মূল সংস্থার জন্য একটি নেমস্পেস তৈরি করি যদি আমি বিশ্বাস করি যে সম্ভবত অন্য গ্রন্থাগারগুলির সাথে ফাংশন থাকতে পারে বা নামের দ্বন্দ্বগুলি টাইপ করতে পারে। এছাড়া ব্র্যান্ড কোড, Ala করতে সাহায্য করে বুস্ট ::


3

আমি অ্যাপ্লিকেশনটির জন্য একটি শীর্ষ-স্তরের নেমস্পেস এবং উপাদানগুলির জন্য সাব নেমস্পেস ব্যবহার করতে পছন্দ করি।

অন্যান্য নামস্থান থেকে আপনি যেভাবে ক্লাস ব্যবহার করতে পারবেন তা জাভাতে যাওয়ার মতোই আশ্চর্যরকম। আপনি হয় "NAMESPACE ব্যবহার করুন" ব্যবহার করতে পারেন যা "আমদানি প্যাকেজ" বিবৃতিটির অনুরূপ, যেমন স্টাডি ব্যবহার করুন। অথবা আপনি "::" দ্বারা পৃথক শ্রেণীর উপসর্গ হিসাবে প্যাকেজটি উল্লেখ করেছেন, যেমন স্টাড :: স্ট্রিং। এটি জাভাতে "java.lang.String" এর মতো।


3

মনে রাখবেন যে সি ++ এর একটি নেমস্পেসটি আসলে একটি নামের স্থান। তারা জাভাতে প্যাকেজগুলি করে এমন কোনও এনক্যাপসুলেশন সরবরাহ করে না, তাই আপনি সম্ভবত সেগুলি এত বেশি ব্যবহার করবেন না।


2

আমি সি #, পার্ল ইত্যাদির মতো সি ++ নামস্থানগুলি ব্যবহার করেছি It's আমি আমার নিজস্ব অ্যাপ্লিকেশনটি একটি নেমস্পেসে রেখে দেব, তারপরে পৃথককরণের জন্য অন্য নামের জায়গায় একটি পুনরায় ব্যবহারযোগ্য লাইব্রেরি উপাদান component


2

জাভা এবং সি ++ এর মধ্যে অন্য একটি পার্থক্য হ'ল সি ++ তে, ফাইল-সিস্টেমের বিন্যাসটি নেমস্পেসের স্তরক্রমের প্রয়োজন হয় না। সুতরাং আমি একটি একক নেমস্পেসে একটি পুনরায় ব্যবহারযোগ্য লাইব্রেরি এবং উপ-ডিরেক্টরিগুলিতে লাইব্রেরির মধ্যে সাবসিস্টিমে রাখার ঝোঁক রাখছি:

#include "lib/module1.h"
#include "lib/module2.h"

lib::class1 *v = new lib::class1();

কোনও নাম দ্বন্দ্ব হওয়ার সম্ভাবনা থাকলে আমি কেবল নেস্টেড নেমস্পেসে সাবসিস্টিমে রেখে দেব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.