সি ++ এ কেন ফরওয়ার্ড-ডিক্লেয়ার প্রয়োজনীয়
সংকলকটি নিশ্চিত করতে চায় যে আপনি কোনও বানান ভুল করেছেন না বা ফাংশনে ভুল সংখ্যক তর্ক যুক্ত করেছেন passed সুতরাং, এটি জোর দিয়েছিল যে এটি ব্যবহারের আগে এটি 'অ্যাড' (বা অন্য কোনও ধরণের, শ্রেণি বা ফাংশন) এর ঘোষণাকে প্রথম দেখে।
এটি সত্যিই কেবল সংকলকটি কোডটি যাচাই করার জন্য আরও ভাল কাজ করার অনুমতি দেয় এবং এটিকে আলগা প্রান্তটি পরিষ্কার করার অনুমতি দেয় যাতে এটি একটি ঝরঝরে চেহারা অবজেক্ট ফাইল তৈরি করতে পারে। যদি আপনাকে জিনিসগুলি ঘোষণা করতে এগিয়ে না যেতে হয়, সংকলকটি একটি অবজেক্ট ফাইল তৈরি করবে যাতে ফাংশনটি 'অ্যাড' কী হতে পারে তা সম্পর্কে সমস্ত সম্ভাব্য অনুমান সম্পর্কে তথ্য থাকতে হবে। এবং লিঙ্কারে খুব চালাক যুক্তি থাকতে হবে যা চেষ্টা করার জন্য এবং আসলে 'কল' যুক্ত করতে চাইলে আপনি কোন 'যুক্ত' করতে পারেন, যখন 'যোগ' ফাংশনটি কোনও ভিন্ন অবজেক্ট ফাইলে বাস করতে পারে যখন লিঙ্কার তার সাথে যুক্ত হয় যা উত্পাদন করতে যোগ করে একটি dll বা উদাহরণ। লিঙ্কারটি ভুল অ্যাড পেতে পারে এটি সম্ভব possible বলুন আপনি ইন্ট অ্যাড (ইন্ট এ, ফ্লোট বি) ব্যবহার করতে চেয়েছিলেন, তবে দুর্ঘটনাক্রমে এটি লিখতে ভুলে গিয়েছিলেন, তবে লিঙ্কারটি ইতিমধ্যে একটি বিদ্যমান ইনট অ্যাড খুঁজে পেয়েছে (int a, int খ) এবং ভাবা হয়েছে যে এটি সঠিক এবং পরিবর্তে এটি ব্যবহার করেছে। আপনার কোডটি সংকলন করবে, তবে আপনি যা প্রত্যাশা করেছিলেন তা করছে না।
সুতরাং, কেবল বিষয়গুলি স্পষ্ট রাখতে এবং অনুমান করা ইত্যাদি এড়ানোর জন্য, সংকলক জোর দিয়েছিল যে আপনি এটি ব্যবহারের আগে সমস্ত কিছু ঘোষণা করুন।
ঘোষণা এবং সংজ্ঞা মধ্যে পার্থক্য
একদিকে যেমন, একটি ঘোষণা এবং সংজ্ঞা মধ্যে পার্থক্য জানা গুরুত্বপূর্ণ। একটি ঘোষণাপত্রটি কেবল কিছু দেখতে কেমন তা প্রদর্শন করার জন্য যথেষ্ট কোড দেয়, সুতরাং কোনও ফাংশনের জন্য, এটি রিটার্নের ধরণ, কনভেনশন, পদ্ধতির নাম, আর্গুমেন্ট এবং তাদের ধরণগুলি কল করে। তবে পদ্ধতির কোডটি প্রয়োজন নেই। একটি সংজ্ঞা জন্য, আপনি ঘোষণার প্রয়োজন এবং তারপর ফাংশন জন্য কোড।
ফরোয়ার্ড-ডিক্লেয়ারেশন কীভাবে বিল্ডের সময়কে হ্রাস করতে পারে
ইতিমধ্যে ফাংশনটির ঘোষণা রয়েছে এমন শিরোনামকে # অন্তর্ভুক্ত করে আপনি আপনার বর্তমান .cpp বা .h ফাইলে কোনও ফাংশনটির ঘোষণা পেতে পারেন। তবে এটি আপনার সংকলনটিকে ধীর করতে পারে, বিশেষত যদি আপনি আপনার প্রোগ্রামের .cpp পরিবর্তে একটি শিরোনামকে একটি। H এর সাথে অন্তর্ভুক্ত করেন, যেমন # আপনি যে লেখেন তাতে অন্তর্ভুক্ত থাকবে সমস্ত # হেডার অন্তর্ভুক্ত থাকবে আপনি # জন্য অন্তর্ভুক্ত লিখেছেন। হঠাৎ করেই, সংকলকটিতে # অন্তর্ভুক্ত পৃষ্ঠাগুলি এবং কোডের পৃষ্ঠা রয়েছে যা আপনি কেবল এক বা দুটি ফাংশন ব্যবহার করতে চাইলেও এটি সংকলন করতে হবে। এটি এড়াতে, আপনি একটি ফরোয়ার্ড-ডিক্লেয়ারেশন ব্যবহার করতে পারেন এবং কেবলমাত্র ফাইলের শীর্ষে ফাংশনটির ঘোষণাপত্রটি টাইপ করতে পারেন। আপনি যদি কেবল কয়েকটি ফাংশন ব্যবহার করছেন তবে এটি সর্বদা # শিরোনামের সাথে তুলনা করে আপনার সংকলনগুলি আরও দ্রুততর করে তুলতে পারে। সত্যিই বড় প্রকল্পগুলির জন্য,
চক্রীয় রেফারেন্সগুলি ভাঙ্গুন যেখানে দুটি সংজ্ঞা উভয়ই একে অপরকে ব্যবহার করে
অতিরিক্তভাবে, ফরোয়ার্ড-ঘোষণা আপনাকে চক্র ভাঙ্গতে সহায়তা করতে পারে। এখানে দুটি ফাংশন একে অপরকে ব্যবহার করার চেষ্টা করে। যখন এটি ঘটে (এবং এটি করা একেবারে বৈধ জিনিস), আপনি একটি হেডার ফাইল অন্তর্ভুক্ত করতে পারেন, তবে সেই শিরোলেখ ফাইলটি আপনি বর্তমানে যে শিরোনাম ফাইলটি লিখছেন তাতে # অন্তর্ভুক্ত করার চেষ্টা করে .... যা অন্য শিরোনামকে অন্তর্ভুক্ত করে # , যা আপনি লিখছেন এর সাথে # অন্তর্ভুক্ত। আপনি প্রতিটি মস্তকের ফাইলটিকে অন্যটিকে অন্তর্ভুক্ত করার চেষ্টা করে একটি মুরগি এবং ডিমের পরিস্থিতিতে আটকে আছেন। এটি সমাধানের জন্য, আপনি যে কোনও একটি ফাইলের জন্য প্রয়োজনীয় অংশগুলি ফরওয়ার্ড-ডিক্লেয়ার করতে পারেন এবং # ফাইলটি এই ফাইলের বাইরে রেখে যেতে পারেন।
উদাহরণ:
ফাইল কার
#include "Wheel.h" // Include Wheel's definition so it can be used in Car.
#include <vector>
class Car
{
std::vector<Wheel> wheels;
};
ফাইল হুইল
হুম ... এখানে গাড়ির ঘোষনা আবশ্যক কারণ হুইলটির একটি গাড়ীর দিকে একটি পয়েন্টার রয়েছে, তবে কার হিটকে এখানে অন্তর্ভুক্ত করা যাবে না কারণ এটি সংকলক ত্রুটির ফলে ঘটবে। যদি কার.হ.কে অন্তর্ভুক্ত করা হত, তবে তারপরে হুইল এইচকে অন্তর্ভুক্ত করার জন্য হুইলহকে অন্তর্ভুক্ত করার জন্য কার হ'ল অন্তর্ভুক্ত করার চেষ্টা করা হবে এবং এটি চিরকালের জন্য চলবে, পরিবর্তে সংকলকটি একটি ত্রুটি উত্থাপন করে। সমাধানটি তার পরিবর্তে গাড়ি ঘোষণা করার জন্য হ'ল:
class Car; // forward declaration
class Wheel
{
Car* car;
};
যদি ক্লাস হুইলের এমন পদ্ধতি ছিল যা গাড়ীর কলগুলি কল করতে পারে তবে সেই পদ্ধতিগুলি Wheel.cpp এ সংজ্ঞায়িত করা যেতে পারে এবং Wheel.cpp এখন কোনও চক্রের কারণ ছাড়াই Car.h কে অন্তর্ভুক্ত করতে সক্ষম।