সি ++: নেমস্পেসস - শিরোনাম এবং উত্স ফাইলগুলিতে সঠিকভাবে কীভাবে ব্যবহার করবেন?


90

দুটি উত্স ফাইলের একটি জুড়ি বিবেচনা করুন: একটি ইন্টারফেস ডিক্লেয়ারেশন ফাইল ( *.hবা *.hpp) এবং এর বাস্তবায়ন ফাইল ( *.cpp)।

*.hফাইলটি নীচের মতো হতে দিন :

namespace MyNamespace {
  class MyClass {
  public:
    int foo();
  };
}

উত্স ফাইলগুলিতে নেমস্পেস ব্যবহার করার জন্য আমি দুটি পৃথক অনুশীলন দেখেছি:

*.cpp অনুশীলন # 1 দেখাচ্ছে:

#include "MyClass.h"
using namespace MyNamespace;

int MyClass::foo() { ... }

*.cpp অনুশীলন # 2 দেখাচ্ছে:

#include "MyClass.h"
namespace MyNamespace {

  int MyClass::foo() { ... }

}

আমার প্রশ্ন: এই দুটি অনুশীলনের মধ্যে কি কোনও পার্থক্য রয়েছে এবং একটিকে অন্যের চেয়ে ভাল বলে বিবেচনা করা হয়?


30
অপশন 3 রয়েছে: কেবল আমাদের পুরো নাম, যেমন int MyNamespace::MyClass::foo() ...
বেনিয়ামিন ব্যানিয়ার

4
সম্ভাব্য সদৃশ: স্ট্যাকওভারফ্লো.com
ডেভিড

@ ডেভ সদৃশ নয় এই প্রশ্নগুলি একে অপরের পরিপূরক। এই প্রশ্নের সাথে "আরও পড়ুন ..." হিসাবে ডেভের সরবরাহিত লিঙ্কটি যুক্ত করার পরামর্শ দিন। আমার প্রশ্ন novices সঠিক শৈলী চয়ন করতে সাহায্য করবে।
নিকোলায়

সম্ভাব্য অনুরূপ: stackoverflow.com/questions/8210935/...
Firedragon

উত্তর:


65

একটি কোড পঠনযোগ্যতার দিক থেকে, আমার মতে সম্ভবত # 2 পদ্ধতিটি এই কারণে ব্যবহার করা ভাল:

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


ডেভ আপনার প্রশ্নের সাথে তার মন্তব্যে যুক্ত প্রশ্নটি আপনি যে দুটি পদ্ধতির দিকে তাকিয়ে রয়েছেন তার মধ্যে পার্থক্যগুলির (কিছু যদি থাকে) কিছু মূল পয়েন্টেরও রূপরেখা দেয়
ড্যান এফ

ছেলেরা, কার উত্তর নির্বাচন করতে হবে তা আমি সত্যিই জানি না। একে অপরের পরিপূরক হওয়ার সময় তাদের ছেদ রয়েছে।
নিকোলে

কেবল স্বীকৃতি দেওয়ার জন্য মন্তব্য করছি যে কিছু আইডিই'র মতো ক্লিওন কেবলমাত্র বিকল্প / অনুশীলন # 2 ব্যবহার করলে বাস্তবায়নগুলি সনাক্ত করবে।
পেড্রোস্তানাকা

@ পেড্রোটানাকা কি এখনও এই অবস্থা? এ জাতীয় কোনও সমস্যা আমি লক্ষ্য করিনি।
জন ম্যাকফার্লেন

@ জেএমসিএফ মন্তব্য প্রকাশের সময় থেকে আমি যাচাই করিনি। ক্লিওনের প্রাথমিক সংস্করণগুলিতে সমস্যা দেখা দিয়েছে।
পেদ্রোস্তানক

52

সবচেয়ে পরিষ্কার আপনি হ'ল বিকল্পটি:

int MyNamespace::MyClass::foo()
{
    //  ...
}

এটিও খুব ভার্জোজ; বেশিরভাগ মানুষের পক্ষে যেহেতু using namespaceকমপক্ষে আমার অভিজ্ঞতায় নাম বিবাদগুলির জন্য গ্রহণযোগ্য, খুব সীমিত স্কোপ এবং স্থান ব্যতীত এড়ানো উচিত, তাই আমি সাধারণত আপনার # 2 ব্যবহার করি।


4
ধন্যবাদ খুব পরিষ্কার। একসাথে আমরা নেমস্পেস ব্যবহারকারীদের জন্য একটি ভাল FAQ পৃষ্ঠা তৈরি করেছি। :)
নিকোলে

4
ছেলেরা, কার উত্তর নির্বাচন করতে হবে তা আমি সত্যিই জানি না। একে অপরের পরিপূরক হওয়ার সময় তাদের ছেদ রয়েছে।
নিকোলে

10

এই দুটি অনুশীলনের মধ্যে কোনও পার্থক্য আছে কি?

হ্যাঁ. # 1 এবং # 2 হ'ল যথাযথভাবে ব্যবহার-নির্দেশনা এবং একটি নেমস্পেস সংজ্ঞা উদাহরণ । এক্ষেত্রে তারা কার্যকরভাবে একই তবে এর অন্যান্য পরিণতিও রয়েছে। উদাহরণস্বরূপ, আপনি যদি পাশাপাশি একটি নতুন শনাক্তকারী পরিচয় করিয়ে দেন তবে এর MyClass::fooআলাদা সুযোগ থাকবে:

# 1:

using namespace MyNamespace;
int x;  // defines ::x

# 2:

namespace MyNamespace {
  int x;  // defines MyNamespace::x
}

একজনকে কি অন্যের চেয়ে ভাল মনে করা হয়?

# 1 পেশাদাররা: আরও কিছুটা পরিশ্রমে; দুর্ঘটনাক্রমে MyNamespaceঅজানা কিছুতে প্রবর্তন করা আরও শক্ত । কনস: অজান্তেই বিদ্যমান সনাক্তকারীদের টানতে পারে।

# 2 পেশাদাররা: আরও স্পষ্ট যে বিদ্যমান শনাক্তকারীদের সংজ্ঞা এবং নতুন শনাক্তকারীদের ঘোষণা উভয়েরই অন্তর্ভুক্ত MyNamespace। কনস: অনিচ্ছাকৃতভাবে সনাক্তকারীদের পরিচয় করিয়ে দেওয়া সহজ MyNamespace

# 1 এবং # 2 উভয়ের সমালোচনা হ'ল তারা সম্ভবত একটি সম্পূর্ণ নেমস্পেসের উল্লেখ করছেন যখন আপনি কেবল সদস্যদের সংজ্ঞা বিবেচনা করেন MyNamespace::MyClass। এটি ভারী হাতে এবং এটি উদ্দেশ্যটি খারাপভাবে যোগাযোগ করে।

# 1 এর সম্ভাব্য বিকল্পটি হ'ল ব্যবহার-ঘোষণা, যা আপনার আগ্রহী শুধুমাত্র সনাক্তকারীকে অন্তর্ভুক্ত করে:

#include "MyClass.h"
using MyNamespace::MyClass;

int MyClass::foo() { ... }

5

আমি আরও যুক্ত করতে চাই যে আপনি যদি কোনও সিপিপি ফাইলে কোনও টেম্পলেট বিশেষায়নের বাস্তবায়নের কোনও কারণে সিদ্ধান্ত নেন এবং কেবলমাত্র আপনার উপর নির্ভর করেন তবে using namespaceআপনি নিম্নলিখিত সমস্যার সমাধান করবেন:

// .h file
namespace someNameSpace
{
  template<typename T>
    class Demo
    {
      void foo();
    };
}

// .cpp file
using namespace someNameSpace;

template<typename T>
void Demo<T>::foo(){}

// this will produce
// error: specialization of 'template<class T> void someNameSpace::Demo<T>::foo()' in different namespace [-fpermissive]
template<>
void Demo<int>::foo(){}

অন্যথায় যদি আপনি # 2 পদ্ধতি প্রয়োগ করেন তবে এটি ঠিক থাকবে।


0

ঘোষণা- ব্যবহার করে আমি আরও একটি উপায় যুক্ত করতে চাই :

#include "MyClass.h"
using MyNamespace::MyClass;

int MyClass::foo() { ... }

শ্রেণীর অনেকগুলি কার্যকারিতা থাকলে এইভাবে আপনাকে অনেক সময় নেমস্পেসের নাম টাইপ করা থেকে বাঁচায়

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