কেবলমাত্র .cpp ফাইল অন্তর্ভুক্ত করার সময় যখন সমস্ত কিছু কাজ করে তখন আমাদের কেন .h অন্তর্ভুক্ত করা দরকার?


18

আমাদের ফাইল .hএবং .cppফাইল দুটি অন্তর্ভুক্ত করার দরকার নেই কেন আমরা কেবল .cppফাইলটি যুক্ত করে এটি কাজ করতে পারি ?

উদাহরণস্বরূপ: একটি file.hধারণামূলক বিবরণী তৈরি করা, তারপরে একটি file.cppসংজ্ঞা সংজ্ঞা তৈরি করা এবং উভয়টি অন্তর্ভুক্ত করে main.cpp

বিকল্পভাবে: file.cppএটি সহ একটি ঘোষণা / সংজ্ঞা (কোনও প্রোটোটাইপ নেই) তৈরি করা main.cpp

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


আপনার গবেষণা ভাগ করে নেওয়া প্রত্যেককে সহায়তা করে । আপনি কী চেষ্টা করেছেন এবং কেন এটি আপনার প্রয়োজনীয়তা মেটেনি তা আমাদের বলুন। এটি প্রমাণ করে যে আপনি নিজেকে সাহায্য করার চেষ্টা করার জন্য সময় নিয়েছেন, এটি আমাদের সুস্পষ্ট উত্তরের পুনরাবৃত্তি থেকে বাঁচায় এবং সর্বোপরি এটি আপনাকে আরও নির্দিষ্ট এবং প্রাসঙ্গিক উত্তর পেতে সহায়তা করে get আরো দেখুন কিভাবে জিজ্ঞাসা করতে
মশা

আমি দৃ strong়ভাবে এখানে পাশের সম্পর্কিত প্রশ্নগুলি দেখার পরামর্শ দিই। প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জাওয়েজ

এটি প্রোগ্রামারগুলিতে কেন, এবং এসও তেও নয়?
মনিকার সাথে লাইটনেস রেস

@ লাইটনেসেসেসআইনব্রিট কারণ এটি কোডিং শৈলীর প্রশ্ন এবং "কীভাবে" প্রশ্ন নয়।
ক্যাশকু

@CashCow: আপনি ভুল বুঝা তাই মত শোনাচ্ছে, যা না একটি "কীভাবে" সাইট। এটিও মনে হচ্ছে আপনি এই প্রশ্নটিকে ভুল বোঝেন, যা কোডিং শৈলীর প্রশ্ন নয়
মনিকার সাথে লাইটনেস রেস

উত্তর:


29

আপনি উল্লিখিত হিসাবে আপনি ফাইল অন্তর্ভুক্ত করতে পারেন.cpp , এটি একটি খারাপ ধারণা।

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

প্রতিটি .cppফাইলের মধ্যে যা হওয়া উচিত তা হ'ল প্রোগ্রামের সাবসেটের সংজ্ঞা যেমন যেমন একটি শ্রেণি, যৌক্তিকভাবে ফাংশনগুলির সংগঠিত গোষ্ঠী, গ্লোবাল স্ট্যাটিক ভেরিয়েবল (কিছুটা হলেও অল্প ব্যবহার করুন) ইত্যাদি includes

প্রতিটি সংকলন ইউনিট ( .cppফাইল) এর মধ্যে এর সংজ্ঞা সংকলন সংকলনের জন্য যা প্রয়োজন তা ঘোষণা অন্তর্ভুক্ত করে। এটি যে ক্রিয়াকলাপগুলি এবং ক্লাসগুলির উল্লেখ করে তা ট্র্যাক করে রাখে তবে এতে থাকে না, সুতরাং লিঙ্কারটি পরে এটি সমাধান করতে পারে যখন এটি কোনও এক্সিকিউটেবল বা লাইব্রেরির সাথে অবজেক্ট কোডটি একত্রিত করে।

উদাহরণ

  • Foo.h -> ক্লাস ফু এর জন্য ঘোষণা (ইন্টারফেস) রয়েছে।
  • Foo.cpp -> ক্লাস ফু এর সংজ্ঞা (বাস্তবায়ন) ধারণ করে।
  • Main.cpp-> প্রধান পদ্ধতি, প্রোগ্রাম এন্ট্রি পয়েন্ট থাকে। এই কোডটি একটি ফু ইনস্ট্যান্টিয়েট করে এবং এটি ব্যবহার করে।

উভয় Foo.cppএবং Main.cppঅন্তর্ভুক্ত করা প্রয়োজন Foo.hFoo.cppএটির প্রয়োজন কারণ এটি শ্রেণি ইন্টারফেসকে সমর্থন করে এমন কোডটি সংজ্ঞায়িত করছে, সুতরাং সেই ইন্টারফেসটি কী তা তা জানতে হবে। Main.cppএটির প্রয়োজন কারণ এটি একটি ফু তৈরি করছে এবং তার আচরণকে আহ্বান করছে, সুতরাং সেই আচরণটি কী তা জানতে হবে, স্মৃতিতে একটি ফু এর আকার এবং এর কার্যকারিতা কীভাবে খুঁজে পাওয়া যায় ইত্যাদি but তবে এটি এখনও বাস্তব বাস্তবায়নের প্রয়োজন নেই।

সংকলকটি উত্পন্ন করবে যা Foo.oথেকে Foo.cppসংকলিত আকারে সমস্ত ফু ক্লাস কোড রয়েছে। এটি উত্পন্ন করে Main.oযার মধ্যে মূল পদ্ধতি এবং ক্লাস ফু-র অবিলম্বে উল্লেখগুলি অন্তর্ভুক্ত রয়েছে।

এখন লিঙ্কারটি আসে, যা দুটি অবজেক্ট ফাইল Foo.oএবং Main.oএকটি এক্সিকিউটেবল ফাইলের সাথে সংযুক্ত করে। এটি অমীমাংসিত ফু এর রেফারেন্সগুলিকে Main.oদেখে কিন্তু Foo.oএটিতে প্রয়োজনীয় চিহ্নগুলি রয়েছে এটি দেখে তাই এটি কথা বলতে "বিন্দুগুলিকে সংযুক্ত করে"। একটি ফাংশন কল Main.oএখন সংকলিত কোডের আসল অবস্থানের সাথে সংযুক্ত আছে তাই রানটাইম সময় প্রোগ্রামটি সঠিক স্থানে যেতে পারে।

আপনি যদি Foo.cppফাইলটি অন্তর্ভুক্ত করে থাকেন Main.cppতবে ফু ফু ক্লাসের দুটি সংজ্ঞা থাকবে। লিঙ্কারটি এটি দেখবে এবং বলবে "কোনটি বেছে নেবে তা আমি জানি না, সুতরাং এটি একটি ত্রুটি।" সংকলন পদক্ষেপটি সফল হবে, তবে লিঙ্কিং হবে না। (যদি না আপনি কেবল সংকলন করেন Foo.cppতবে তবে কেন এটি আলাদা .cppফাইলে রয়েছে?)

অবশেষে, বিভিন্ন ফাইল ধরণের ধারণাটি কোনও সি / সি ++ সংকলকটির সাথে অপ্রাসঙ্গিক। এটি "পাঠ্য ফাইলগুলি" সংকলন করে যা প্রত্যাশিতভাবে পছন্দসই ভাষার জন্য বৈধ কোড রয়েছে। কখনও কখনও এটি ফাইল এক্সটেনশনের ভিত্তিতে ভাষা বলতে সক্ষম হতে পারে। উদাহরণস্বরূপ, .cকোনও সংকলক বিকল্প নেই এমন একটি ফাইল সংকলন করুন এবং এটি সি ধরে নেবে , যখন একটি .ccবা .cppএক্সটেনশান এটি সি ++ ধরে নিতে বলে। যাইহোক, আমি সহজেই একটি সংকলককে একটি .hবা এমনকি .docxফাইল সি ++ হিসাবে সংকলন করতে বলতে পারি এবং এটি যদি কোনও .oসরল পাঠ্য বিন্যাসে বৈধ সি ++ কোড থাকে তবে এটি একটি অবজেক্ট ( ) ফাইল নির্গত করবে । এই এক্সটেনশনগুলি প্রোগ্রামারের সুবিধার জন্য আরও বেশি। যদি আমি দেখি Foo.hএবং Foo.cpp, আমি অবিলম্বে অনুমান করি যে প্রথমটিতে শ্রেণির ঘোষণা রয়েছে এবং দ্বিতীয়টিতে সংজ্ঞা রয়েছে।


আপনি এখানে যে যুক্তি দিচ্ছেন তা আমি বুঝতে পারি না। যদি আপনি কেবল এতে অন্তর্ভুক্ত Foo.cppকরেন তবে Main.cppআপনাকে .hফাইল অন্তর্ভুক্ত করার দরকার নেই , আপনার একটি কম ফাইল রয়েছে, আপনি এখনও পঠনযোগ্যতার জন্য পৃথক ফাইলগুলিতে বিভক্তকরণ কোডে জিতেছেন এবং আপনার সংকলন আদেশটি সহজ। আমি যখন শিরোনাম ফাইলগুলির গুরুত্ব বুঝতে পারি তবে আমার মনে হয় না এটি এটি
বেনজামিন গ্রুইনবাউম

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

2
If you had included the Foo.cpp file in Main.cpp, there would be two definitions of class Foo.প্রশ্ন সম্পর্কিত সবচেয়ে গুরুত্বপূর্ণ বাক্য।
marczellm

@ স্নোম্যান রাইট, যা আমি মনে করি আপনার দৃষ্টি নিবদ্ধ করা উচিত - একাধিক সংকলন ইউনিট। ছোট টুকরা অবধি ব্রেকিং কোডের জন্য শিরোলেখ ফাইলগুলির সাথে / বিহীন কোড স্টিক করা দরকারী এবং শিরোলেখ ফাইলগুলির উদ্দেশ্যে অরথোগোনাল। আমরা যা করতে চাই তা যদি কেবল ফাইলগুলিতে বিভক্ত হয় তবে ফাইলগুলি আমাদের কিছুই কিনে না - একবার আমাদের ডায়নামিক লিঙ্কিং, শর্তসাপেক্ষ লিঙ্কিং এবং আরও অগ্রিম বিল্ডগুলির প্রয়োজন হয় তারা হঠাৎ খুব কার্যকর useful
বেনিয়ামিন গ্রুইনবাউম

সি / সি ++ সংকলক / লিঙ্কারের জন্য উত্সটি সংগঠিত করার জন্য অনেকগুলি উপায় রয়েছে। প্রশ্নকর্তা প্রক্রিয়া সম্পর্কে অনিশ্চিত ছিলেন, সুতরাং আমি কোডটি কীভাবে সংগঠিত করব এবং কীভাবে প্রক্রিয়াটি কাজ করে তার সেরা অনুশীলনটি ব্যাখ্যা করেছিলাম। কোডকে আলাদাভাবে সাজানো সম্ভব সম্পর্কে আপনি কেশকে বিভক্ত করতে পারেন, তবে বাস্তবটি রয়ে গেছে, আমি ব্যাখ্যা করেছি যে সেখানে কীভাবে 99% প্রকল্পগুলি এটি করে যা এটি একটি কারণের জন্য সেরা অনুশীলন। এটি ভাল কাজ করে এবং আপনার বিচক্ষণতা বজায় রাখে।

9

সি এবং সি ++ প্রিপ্রসেসরের ভূমিকা সম্পর্কে আরও পড়ুন , যা সি বা সি ++ সংকলকটির ধারণাগতভাবে প্রথম "পর্ব" (icallyতিহাসিকভাবে এটি একটি পৃথক প্রোগ্রাম ছিল /lib/cpp; এখন, কার্য সম্পাদনের কারণে এটি সংকলকের ভিতরে সঠিকভাবে সংহত করা হয়েছে ) cc1 বা or cc1plusবিশেষত জিএনইউ cppপ্রিপ্রোসেসরের ডকুমেন্টেশন পড়ুন । সুতরাং অনুশীলন করে সংকলক ধারণাগতভাবে প্রথমে আপনার সংকলন ইউনিটকে (বা অনুবাদ ইউনিট ) প্রিপ্রোসেসেস করে এবং তারপরে প্রাক-সংযুক্ত ফর্মটিতে কাজ করে।

আপনাকে সম্ভবত সর্বদা হেডার ফাইলটি অন্তর্ভুক্ত করতে হবে file.hযদি এটিতে থাকে ( কনভেনশন এবং অভ্যাস অনুসারে ):

  • ম্যাক্রো সংজ্ঞা
  • ধরনের সংজ্ঞা (যেমন typedef, struct, classইত্যাদি, ...)
  • static inlineফাংশন সংজ্ঞা
  • বাহ্যিক কার্যাদি ঘোষণা

লক্ষ্য করুন যে এগুলি একটি শিরোনামের ফাইলে রাখা কনভেনশনগুলির (এবং সুবিধার্থে) বিষয়।

অবশ্যই, আপনার বাস্তবায়ন file.cppউপরের সমস্ত প্রয়োজন, তাই #include "file.h" প্রথমে চান।

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

মুল বক্তব্যটি হ'ল প্রিপ্রসেসর কেবল পাঠ্য ক্রিয়াকলাপ করছে। আপনি (নীতিগতভাবে) এটিকে সম্পূর্ণ অনুলিপি এবং আটকানো বা এটিকে অন্য "প্রিপ্রসেসর" বা সি কোড জেনারেটর ( জিপিপি বা এম 4 এর মতো ) দ্বারা প্রতিস্থাপন করতে পারেন ।

একটি অতিরিক্ত সমস্যা হ'ল সাম্প্রতিক সি (বা সি ++) স্ট্যান্ডার্ডগুলি বেশ কয়েকটি মানক শিরোনামকে সংজ্ঞায়িত করে। বেশিরভাগ বাস্তবায়নই এই স্ট্যান্ডার্ড শিরোনামগুলিকে (বাস্তবায়ন নির্দিষ্ট) ফাইল হিসাবে বাস্তবায়িত করে , তবে আমি বিশ্বাস করি যে মানক বাস্তবায়নের জন্য কিছু জাদুর কৌশল সহ (যেমন #include <stdio.h>সি, বা #include <vector>সি ++) অন্তর্ভুক্ত করা সম্ভব হবে (যেমন কিছু ডাটাবেস বা কিছু ব্যবহার করে) সংকলক ভিতরে তথ্য )।

জিসিসি সংকলক ব্যবহার করে (উদাঃ gccবা g++) আপনি -Hপ্রতিটি অন্তর্ভুক্তি সম্পর্কে অবহিত করতে পতাকাটি ব্যবহার করতে পারেন এবং -C -Eপতাকাগুলি পূর্বনির্ধারিত ফর্মটি পেতে পারেন। অবশ্যই প্রিপ্রোসেসিংকে প্রভাবিত করে এমন আরও অনেক সংকলক পতাকা রয়েছে (যেমন অন্তর্ভুক্ত ফাইলগুলি অনুসন্ধানের -I /some/dir/জন্য যুক্ত করা /some/dir/এবং -Dকিছু প্রিপ্রোসেসর ম্যাক্রো ইত্যাদি পূর্বনির্ধারিত করা ইত্যাদি)।

বিশেষ দ্রষ্টব্য। সি ++ এর ভবিষ্যতের সংস্করণগুলিতে (সম্ভবত সি ++ ২০ , সম্ভবত পরেও) সি ++ মডিউল থাকতে পারে ।


1
লিঙ্কগুলি পচে গেলে, এটি কি এখনও একটি ভাল উত্তর হতে পারে?
ড্যান পিচেলম্যান

4
আমি আমার উত্তরটি এটির উন্নতি করতে সম্পাদনা করেছি এবং আমি সাবধানে উইকিপিডিয়া বা জিএনইউ ডকুমেন্টেশন-এর লিঙ্কগুলি বেছে নিয়েছি - যা আমি বিশ্বাস করি যে দীর্ঘকাল প্রাসঙ্গিক থাকবে।
বেসাইল স্টারিনকিভিচ

3

সি ++ এর একাধিক-ইউনিট বিল্ড মডেলের কারণে আপনার কোডটিতে এমন একটি উপায়ের প্রয়োজন যা আপনার প্রোগ্রামে একবারে প্রদর্শিত হয় (সংজ্ঞাগুলি) এবং আপনার প্রোগ্রামের প্রতিটি অনুবাদ ইউনিটে (ঘোষণাপত্র) প্রদর্শিত হবে এমন কোডের একটি উপায় প্রয়োজন।

এ থেকে সি ++ শিরোনাম ইডিয়ম জন্মগ্রহণ করে। এটি একটি কারণে সম্মেলন।

আপনি করতে পারেন একটি একক অনুবাদ ইউনিট মধ্যে আপনার সমগ্র প্রোগ্রাম ডাম্প কিন্তু কোড পুনরায় ব্যবহার, ইউনিট টেস্টিং এবং আন্ত মডিউল নির্ভরতা হ্যান্ডলিং সঙ্গে এই প্রবর্তন সমস্যা। এটিও কেবল একটি বড় গণ্ডগোল।


0

থেকে নির্বাচিত উত্তরটি কেন আমাদের একটি শিরোনাম ফাইল লেখার প্রয়োজন? এটি একটি যুক্তিসঙ্গত ব্যাখ্যা, তবে আমি অতিরিক্ত বিশদ যুক্ত করতে চেয়েছিলাম।

দেখে মনে হয় যে শিরোনাম ফাইলগুলির জন্য যুক্তিযুক্ত সি / সি ++ পড়ানো এবং আলোচনায় হারিয়ে যেতে ঝোঁক।

শিরোনাম ফাইল দুটি অ্যাপ্লিকেশন বিকাশের সমস্যার সমাধান সরবরাহ করে:

  1. ইন্টারফেস এবং বাস্তবায়ন পৃথকীকরণ
  2. বড় প্রোগ্রামের জন্য সংকলন / লিঙ্ক বার উন্নত

সি / সি ++ ছোট প্রোগ্রামগুলি থেকে খুব বড় মাল্টি-মিলিয়ন লাইনে, বহু-হাজার ফাইল প্রোগ্রামে স্কেল করতে পারে। অ্যাপ্লিকেশন বিকাশ এক বিকাশকারী দলের থেকে শত শত বিকাশকারী পর্যন্ত স্কেল করতে পারে।

আপনি বিকাশকারী হিসাবে বেশ কয়েকটি টুপি পরতে পারেন। বিশেষত, আপনি ফাংশন এবং ক্লাসগুলির ইন্টারফেসের ব্যবহারকারী হতে পারেন, বা আপনি ফাংশন এবং ক্লাসগুলির একটি ইন্টারফেসের লেখক হতে পারেন।

আপনি যখন কোনও ফাংশন ব্যবহার করছেন তখন আপনাকে ফাংশন ইন্টারফেস, কোন প্যারামিটারগুলি ব্যবহার করতে হবে, ফাংশনগুলি কী ফিরিয়ে দেয় এবং ফাংশনটি কী করে তা আপনাকে জানতে হবে know এটি প্রয়োগের দিকে না তাকিয়ে সহজেই শিরোনাম ফাইলে নথিবদ্ধ হয়। আপনি কখন বাস্তবায়ন পড়েছেন printf? আমরা প্রতিদিন এটি ব্যবহার করুন কিনুন।

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

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

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

এমনকি যদি আপনি একটি ছোট অ্যাপ্লিকেশন বিকাশ করছেন তবে বড় আকারের সফ্টওয়্যার বিকাশ কৌশলগুলি ব্যবহার করা ভাল অভ্যাস। তবে কেন আমাদের এই অভ্যাসগুলি ব্যবহার করা উচিত তাও আমাদের মনে রাখতে হবে।


0

আপনি পাশাপাশি জিজ্ঞাসা করতে পারেন কেন কেবল আপনার সমস্ত কোড একটি ফাইলের মধ্যে রাখছেন না।

সহজ উত্তরটি কোড রক্ষণাবেক্ষণ।

এমন সময় আছে যখন শ্রেণি তৈরি করা যুক্তিসঙ্গত হয়:

  • সমস্ত একটি শিরোলেখের মধ্যে অন্তর্ভুক্ত
  • সমস্ত একটি সংকলন ইউনিটের মধ্যে এবং কোনও শিরোনাম নয়।

যখন শিরোনামে সম্পূর্ণভাবে ইনলাইন করা যুক্তিসঙ্গত হয় তখন ক্লাসটি সত্যিকার অর্থে কয়েকটি বেসিক গেটার এবং সেটটার এবং সম্ভবত এমন একটি কনস্ট্রাক্টরের সাথে ডেটা স্ট্রাক্ট থাকে যা তার সদস্যদের সূচনা করার জন্য মান গ্রহণ করে।

(টেমপ্লেটগুলি, যা সকলের মধ্যে অন্তর্ভুক্ত হওয়া দরকার, এটি কিছুটা আলাদা ইস্যু)।

অন্য সময় শিরোনামের মধ্যে ক্লাস তৈরির সময়টি এমন হয় যখন আপনি ক্লাসটি একাধিক প্রকল্পে ব্যবহার করতে পারেন এবং বিশেষত গ্রন্থাগারে লিঙ্ক যুক্ত এড়াতে চান।

এমন একটি সময় যখন আপনি কোনও সংকলন ইউনিটের মধ্যে একটি সম্পূর্ণ শ্রেণি অন্তর্ভুক্ত করতে পারেন এবং এর শিরোনামটি একেবারেই প্রকাশ করবেন না:

  • "প্রয়োগ" শ্রেণি যা কেবল প্রয়োগ করে এমন শ্রেণীর দ্বারা ব্যবহৃত হয়। এটি সেই শ্রেণীর একটি বাস্তবায়ন বিশদ এবং বাহ্যিকভাবে ব্যবহৃত হয় না।

  • একটি বিমূর্ত বেস শ্রেণীর একটি বাস্তবায়ন যা কোনও ধরণের কারখানা পদ্ধতি দ্বারা তৈরি করা হয় যা বেস শ্রেণিতে একটি পয়েন্টার / রেফারেন্স / স্মার্ট পয়েন্টার দেয়)। কারখানার পদ্ধতিটি শ্রেণীর দ্বারা প্রকাশ করা হবে না itself (এ ছাড়াও যদি ক্লাসটির কোনও উদাহরণ থাকে যা একটি স্ট্যাটিক উদাহরণের মাধ্যমে কোনও টেবিলে নিজেকে নিবন্ধিত করে তবে এটি কারখানার মাধ্যমে প্রকাশেরও প্রয়োজন হয় না)।

  • একটি "ফান্টেক্টর" টাইপ ক্লাস।

অন্য কথায়, যেখানে আপনি চাইছেন না যে কেউ হেডার অন্তর্ভুক্ত করবেন।

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

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

নক-অন প্রভাব সম্পর্কে চিন্তা না করে এ জাতীয় পরিবর্তনগুলি "নিরাপদ" করে তোলে এবং এটিই "রক্ষণাবেক্ষণ" বলতে বোঝায়।


-1

ডাব্লু ফাইলগুলি কেন প্রয়োজন তা সঠিকভাবে দেখানোর জন্য স্নোম্যানের উদাহরণটির জন্য একটু বাড়ানো দরকার need

নাটকে অন্য ক্লাস বার যুক্ত করুন যা ক্লাস ফু এর উপরও নির্ভরশীল।

Foo.h -> ক্লাস ফু এর জন্য ঘোষণা রয়েছে

Foo.cpp -> ক্লাস ফু এর সংজ্ঞা (অভিশংসন) ধারণ করে

মেইন.সি.পি.পি -> ফু টাইপের ভেরিয়েবল ব্যবহার করে।

বার.cpp -> ফু টাইপের ভেরিয়েবল ব্যবহার করে।

এখন সমস্ত সিপিপি ফাইলগুলিকে Foo.h অন্তর্ভুক্ত করা দরকার অন্য এক সিপিপি ফাইলের মধ্যে Foo.cpp অন্তর্ভুক্ত করা একটি ত্রুটি হবে। লিঙ্কার ব্যর্থ হবে কারণ ক্লাস ফু একাধিকবার সংজ্ঞায়িত হবে।


1
তাও হয় না। এটি .hযেভাবেই ফাইলগুলিতে সমাধান করা হয় ঠিক একইভাবে সমাধান করা যেতে পারে - এতে অন্তর্ভুক্ত গার্ড রয়েছে এবং .hযেভাবেই ফাইলগুলির সাথে আপনার ঠিক একই সমস্যা রয়েছে । .hফাইলগুলি মোটেই এই জাতীয় নয় ।
বেনজামিন গ্রুইনবাউম

আমি নিশ্চিত নই যে আপনি কীভাবে প্রহরীগুলি অন্তর্ভুক্ত করবেন কেবলমাত্র তারা প্রতি ফাইলের জন্য কাজ করে (যেমন প্রিপ্রোসেসড করেন) include এই ক্ষেত্রে যেহেতু মেইন.পি.পি এবং বার.সি.পি. পৃথক ফাইল রয়েছে Foo.cpp কেবলমাত্র একবারেই এই দুটি ক্ষেত্রেই অন্তর্ভুক্ত থাকবে (রক্ষিত বা কোনও পার্থক্য রাখে না)। মেইন.পি.পি এবং বার.cpp উভয়ই সংকলন করবে। ক্লাস ফু এর দ্বৈত সংজ্ঞার কারণে লিঙ্ক ত্রুটি এখনও ঘটে occurs তবে উত্তরাধিকারও আছে যা আমি উল্লেখও করি নি। ঘোষণা ইত্যাদি বাহ্যিক মডিউল (Dll এর) জন্য
SkaarjFace

না, এটি একটি সংকলন ইউনিট হবে, আপনি .cppফাইল অন্তর্ভুক্ত করার কারণে কোনও লিঙ্কিং হবে না ।
বেনজামিন গ্রুইনবাউম

আমি বলিনি এটি সংকলন করবে না। তবে এটি একই এক্সিকিউটেবলের সাথে মূল.ও এবং বার.ও উভয়কেই লিঙ্ক করবে না। লিঙ্ক না করে মোটেই সংকলনের মূল বিষয়টি কী।
স্কারজিক্স

আহ ... চালানোর কোড পাচ্ছেন? আপনি এখনও এটি লিঙ্ক করতে পারেন তবে কেবল ফাইলগুলিকে একে অপরের সাথে লিঙ্ক করবেন না - বরং তারা একই সংকলন ইউনিট হবেন।
বেনজামিন গ্রুয়েনবাউম

-2

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

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