আপনার কোডটি একাধিক ফাইলে বিভক্ত করার সময় ঠিক কী একটি .h ফাইলে যাওয়া উচিত এবং কোন একটি .cpp ফাইলে যাওয়া উচিত?
.hpp
ফাইলে যায় এবং সি ঘোষণাগুলি কোনও .h
ফাইলে যায়। সি এবং সি ++ কোড মিশ্রিত করার সময় এটি খুব সহায়ক (
আপনার কোডটি একাধিক ফাইলে বিভক্ত করার সময় ঠিক কী একটি .h ফাইলে যাওয়া উচিত এবং কোন একটি .cpp ফাইলে যাওয়া উচিত?
.hpp
ফাইলে যায় এবং সি ঘোষণাগুলি কোনও .h
ফাইলে যায়। সি এবং সি ++ কোড মিশ্রিত করার সময় এটি খুব সহায়ক (
উত্তর:
শিরোনাম ফাইলগুলি ( .h
) একাধিক ফাইলের জন্য প্রয়োজনীয় তথ্য সরবরাহ করার জন্য ডিজাইন করা হয়েছে। শ্রেণীর ঘোষণা, ফাংশন প্রোটোটাইপ এবং গণনার মতো বিষয়গুলি সাধারণত হেডার ফাইলগুলিতে যায়। এক কথায়, "সংজ্ঞা"।
কোড ফাইল ( .cpp
) বাস্তবায়ন তথ্য সরবরাহ করার জন্য ডিজাইন করা হয়েছে যা কেবল একটি ফাইলে জানা দরকার। সাধারণভাবে, ফাংশন সংস্থাগুলি এবং অভ্যন্তরীণ ভেরিয়েবলগুলি যেগুলি / অন্য মডিউল দ্বারা কখনও অ্যাক্সেস করা উচিত নয়, সেগুলি .cpp
ফাইলে অন্তর্ভুক্ত। এক কথায়, "বাস্তবায়ন"।
নিজেকে "যেখানে আমি এটি পরিবর্তন করি, জিনিসগুলি আবার সংকলন করতে অন্য ফাইলগুলিতে কোড পরিবর্তন করতে হবে কি তা কোথায়" তা যাচাই করার জন্য নিজেকে জিজ্ঞাসা করার সবচেয়ে সহজ প্রশ্ন? যদি উত্তর "হ্যাঁ" হয় তবে এটি সম্ভবত শিরোনামের ফাইলে অন্তর্ভুক্ত; উত্তরটি যদি "না" হয় তবে এটি সম্ভবত কোড ফাইলের অন্তর্ভুক্ত।
export
)। # 1 এর আশেপাশের একমাত্র উপায় হ'ল পিআইএমপিএল। export
সমর্থিত হলে # 2 সম্ভব হবে এবং সি ++ 0 এক্স এবং extern
টেম্পলেট ব্যবহার করা সম্ভব হতে পারে । আইএমও, সি ++ এ শিরোনামের ফাইলগুলি তাদের কার্যকারিতা অনেকটাই হারাবে।
ফ্যাক্টটি হ'ল, সি ++ তে এটি কিছুটা জটিল যে সি শিরোনাম / উত্স সংস্থা।
সংকলকটি তার শিরোনামগুলি সঠিকভাবে অন্তর্ভুক্ত করে একটি বড় উত্স (.cpp) ফাইল দেখে sees উত্স ফাইলটি সংকলন ইউনিট যা কোনও অবজেক্ট ফাইলে সংকলিত হবে।
কারণ একটি সংকলন ইউনিট অন্য সংকলন ইউনিটে একটি বাস্তবায়ন সম্পর্কে তথ্য প্রয়োজন হতে পারে। সুতরাং কেউ উদাহরণস্বরূপ একটি উত্সে কোনও ফাংশন বাস্তবায়ন লিখতে পারে এবং অন্য কোনও উত্সে এটি ব্যবহার করার প্রয়োজনে এই ফাংশনটির ডিক্লেয়ারেশন লিখতে পারে।
এই ক্ষেত্রে, একই তথ্যের দুটি অনুলিপি রয়েছে। যা খারাপ ...
সমাধানটি কিছু বিশদ ভাগ করে নেওয়া। উত্সটি বাস্তবায়নের মধ্যে থাকা অবস্থায়, ভাগ করা প্রতীকগুলির ঘোষণাপত্রের মতো কার্যাদি বা কাঠামো, শ্রেণি, এনাম ইত্যাদি সংজ্ঞা, ভাগ করার প্রয়োজন হতে পারে to
শিরোনামগুলি সেই ভাগ করা বিশদটি রাখার জন্য ব্যবহৃত হয়।
একাধিক উত্সের মধ্যে কী ভাগ করা দরকার তা ঘোষণাপত্রের শিরোনামে সরান
সি ++ এ, এমন আরও কিছু জিনিস রয়েছে যা হেডারে রাখা যেতে পারে কারণ তাদেরও ভাগ করে নেওয়া দরকার:
ভাগ করা বাস্তবায়নগুলি সহ যা ভাগ করা দরকার তা সব শিরোনামে যান Move
হ্যাঁ. আসলে, "হেডার" (অর্থাত্ উত্সগুলির মধ্যে ভাগ করা) এর ভিতরে থাকতে পারে এমন অনেকগুলি জিনিস রয়েছে।
এটি জটিল হয়ে ওঠে এবং কিছু ক্ষেত্রে (চিহ্নগুলির মধ্যে বিজ্ঞপ্তি নির্ভরতা), এটি একটি শিরোনামে রাখা অসম্ভব।
এর অর্থ এই যে, চরম ক্ষেত্রে, আপনি এটি করতে পারেন:
আসুন কল্পনা করুন আমাদের একটি টেম্পলেটেড মাইবজেক্ট রয়েছে। আমাদের থাকতে পারত:
// - - - - MyObject_forward.hpp - - - -
// This header is included by the code which need to know MyObject
// does exist, but nothing more.
template<typename T>
class MyObject ;
।
// - - - - MyObject_declaration.hpp - - - -
// This header is included by the code which need to know how
// MyObject is defined, but nothing more.
#include <MyObject_forward.hpp>
template<typename T>
class MyObject
{
public :
MyObject() ;
// Etc.
} ;
void doSomething() ;
।
// - - - - MyObject_implementation.hpp - - - -
// This header is included by the code which need to see
// the implementation of the methods/functions of MyObject,
// but nothing more.
#include <MyObject_declaration.hpp>
template<typename T>
MyObject<T>::MyObject()
{
doSomething() ;
}
// etc.
।
// - - - - MyObject_source.cpp - - - -
// This source will have implementation that does not need to
// be shared, which, for templated code, usually means nothing...
#include <MyObject_implementation.hpp>
void doSomething()
{
// etc.
} ;
// etc.
"বাস্তব জীবনে", এটি সাধারণত কম জটিল হয়। বেশিরভাগ কোডের উত্সটিতে কিছু অন্তর্নিহিত কোড সহ কেবল একটি সরল শিরোনাম / উত্স সংস্থা থাকবে।
তবে অন্যান্য ক্ষেত্রে (মুখ্য বিষয়গুলি একে অপরকে জানার জন্য), আমার প্রতিটি অবজেক্টের জন্য পৃথক ঘোষণা এবং বাস্তবায়ন শিরোনাম থাকতে হয়েছিল, কেবলমাত্র কিছু সংকলনের ত্রুটি দেখতে আমাকে সহায়তা করার জন্য সেই শিরোনাম সহ খালি উত্স সহ।
পৃথক শিরোনামগুলিতে শিরোনামগুলি ভেঙে ফেলার আর একটি কারণ হ'ল সংকলনকে গতিবদ্ধ করা, সংশ্লেষের পার্থকৃত চিহ্নগুলির পরিমাণকে কঠোরভাবে প্রয়োজনীয় হওয়াতে সীমাবদ্ধ করা এবং কোনও ইনলাইন পদ্ধতি প্রয়োগকরণ পরিবর্তিত হলে কেবলমাত্র সামনে ঘোষণার জন্য যত্নশীল এমন উত্সের অভাবনীয় পুনঃসংশোধন এড়ানো।
আপনার কোড সংস্থাকে যতটা সম্ভব সহজ এবং যতটা সম্ভব মডুলার করা উচিত। সোর্স ফাইলে যথাসম্ভব রাখুন। যা ভাগ করা দরকার তা কেবল শিরোনামে প্রকাশ করুন।
তবে যেদিন আপনার টেম্পলেটড অবজেক্টগুলির মধ্যে বিজ্ঞপ্তি নির্ভরতা থাকবে, অবাক হবেন না যদি আপনার কোড সংগঠনটি আরও কিছু "আকর্ষণীয়" হয়ে যায় যে সরল শিরোনাম / উত্স সংস্থা ...
^ _ ^
অন্যান্য সমস্ত উত্তরের পাশাপাশি, আমি আপনাকে বলব যে আপনি একটি শিরোলেখ ফাইলটিতে কী রাখবেন না:
using
ঘোষণা (সর্বাধিক সাধারণ using namespace std;
) একটি শিরোলেখ ফাইলটিতে উপস্থিত হওয়া উচিত নয় কারণ তারা উত্স ফাইলের নাম স্থানটিকে দূষিত করে যা এতে অন্তর্ভুক্ত রয়েছে ।
using
শিরোনামে বিশ্বব্যাপী নেমস্পেসে স্টাফ আনার জন্য কখনই ব্যবহার করবেন না ।
static inline
যখন আপনি টেমপ্লেটগুলির সাথে অভ্যন্তরীণ যোগসূত্রটি একত্রিত করেন তখন কী হয় তার কিছু করার কারণে বেনামে নেমস্পেসের ইনলাইন ফাংশনগুলি সি ++ এ সুপারিশ করা হয় । আনন নেমস্পেসগুলি আপনাকে বাহ্যিক সংযোগ সংরক্ষণ করার সময় ফাংশনগুলি "আড়াল" করতে দেয়।
কি কিছুই কম্পাইল (শূন্য বাইনারি পদচিহ্ন) শিরোনাম ফাইলে যায়।
ভেরিয়েবলগুলি কোনও কিছুর মধ্যে সংকলন করে না, তবে টাইপ ডিক্লেয়ারেশনগুলি করে (কোয়েজগুলি কেবল তারা বর্ণনা করে যে চলকগুলি কীভাবে আচরণ করে)।
ফাংশনগুলি করে না, তবে ইনলাইন ফাংশনগুলি (বা ম্যাক্রোগুলি) করে না কারণ তারা কেবল যেখানে ডাকে সেখানে কোড তৈরি করে।
টেমপ্লেটগুলি কোড নয়, সেগুলি কেবল কোড তৈরির একটি রেসিপি। সুতরাং তারা এইচ ফাইলের মধ্যে যান।
সাধারণভাবে, আপনি শিরোনাম ফাইলটিতে ঘোষণা এবং প্রয়োগকরণ (.cpp) ফাইলে সংজ্ঞা রাখেন। এটি ব্যতিক্রম টেম্পলেটগুলি, যেখানে সংজ্ঞাটি অবশ্যই শিরোনামেও যেতে হবে।
এই প্রশ্নটি এবং এর অনুরূপ প্রশ্নগুলি প্রায়শই এসও-তে জিজ্ঞাসা করা হয়েছে - দেখুন কেন সি ++ এ হেডার ফাইল এবং .cpp ফাইল রয়েছে? এবং সি ++ শিরোনাম ফাইল, উদাহরণস্বরূপ কোড পৃথকীকরণ ।
আপনার ক্লাস এবং ফাংশন ডিক্লেয়ারেশন প্লাস ডকুমেন্টেশন এবং ইনলাইন ফাংশন / পদ্ধতিগুলির সংজ্ঞা (যদিও কিছু তাদের আলাদা .inl ফাইলগুলিতে স্থাপন করতে পছন্দ করে)।
প্রধানত হেডার ফাইলটিতে ক্লাস কঙ্কাল বা ঘোষণা থাকে (ঘন ঘন পরিবর্তন হয় না)
এবং সি পি সি ফাইলে শ্রেণি প্রয়োগ রয়েছে (ঘন ঘন পরিবর্তন হয়)।
আমি দেখতে আশা করি:
সত্যিই উত্তর যদিও দেওয়া হয় না:
শিরোনাম কিছু সংজ্ঞায়িত করে তবে বাস্তবায়ন সম্পর্কে কিছু বলে না। (এই "মেটাফর্টে" টেমপ্লেটগুলি বাদ দিয়ে।
এই বলে যে, আপনার "সংজ্ঞাগুলি" উপ-গোষ্ঠীতে বিভক্ত করা দরকার, এক্ষেত্রে দুটি ধরণের সংজ্ঞা রয়েছে।
এখন, আমি অবশ্যই প্রথম সাবগ্রুপ সম্পর্কে কথা বলছি।
বাকী সফ্টওয়্যার বাস্তবায়নটি ব্যবহার করতে সহায়তা করতে শিরোনামটি আপনার কাঠামোর বিন্যাসটি সংজ্ঞায়িত করতে পারে। আপনি এটিকে আপনার বাস্তবায়নের "বিমূর্ততা" হিসাবে দেখতে চাইতে পারেন, যা হুংকারেই বলা হয়েছে তবে, আমি মনে করি এটি এক্ষেত্রে বেশ উপযুক্ত।
পূর্ববর্তী পোস্টারগুলি যেমন আপনাকে ব্যক্তিগত এবং সর্বজনীন ব্যবহারের ক্ষেত্রগুলি এবং তাদের শিরোনামগুলি ঘোষিত দেখিয়েছে এবং দেখিয়েছে, এর মধ্যে এটিতে ব্যক্তিগত এবং পাবলিক ভেরিয়েবলগুলিও অন্তর্ভুক্ত রয়েছে। এখন, আমি এখানে কোডটির নকশায় যেতে চাই না তবে, আপনি আপনার শিরোনামগুলিতে কী রেখেছিলেন তা বিবেচনা করতে চাইতে পারেন, কারণ এটি শেষ ব্যবহারকারী এবং বাস্তবায়নের মধ্যবর্তী স্তর।
শিরোনাম (। ঘন্টা)
বডি (.cpp)
থাম্বের নিয়ম হিসাবে, আপনি মডিউলটির "ভাগ করা" অংশটি .h এর উপরে রেখেছেন (যে অংশটি অন্যান্য মডিউলগুলি দেখতে সক্ষম হওয়া প্রয়োজন) এবং "ভাগ করে নেই" অংশটি .cpp এ রেখেছেন
পিডি: হ্যাঁ, আমি গ্লোবাল ভেরিয়েবলগুলি অন্তর্ভুক্ত করেছি। আমি তাদের কয়েকবার ব্যবহার করেছি এবং এটি হেডারগুলিতে সংজ্ঞায়িত না করা গুরুত্বপূর্ণ বা আপনি অনেকগুলি মডিউল পাবেন, যার প্রতিটি তার নিজস্ব পরিবর্তনশীল নির্ধারণ করে।
সম্পাদনা: ডেভিডের মন্তব্যের পরে সংশোধিত