আমাদের ব্যক্তিগত সদস্যদের হেডারগুলিতে রাখার দরকার কী?


62

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

  • এটি ব্যবহারকারীর কাছ থেকে শিরোনামকে গোলমাল করে
  • এটি যখনই ইন্টার্নালগুলি সংশোধন করা হয় তখন সমস্ত ক্লায়েন্ট লাইব্রেরির পুনরায় সংকলন করতে বাধ্য করে

এই প্রয়োজনের পিছনে কি কোনও ধারণামূলক কারণ রয়েছে? এটি কি কেবল সংকলকটির কাজ সহজ করার জন্য?


আপনি শিরোনামে একটি খালি কাঠামো ঘোষণা করতে পারেন তবে আপনি যখন এটি ব্যবহার করেন কেবল তখনই আপনি যেমন স্ট্রাক্টের পয়েন্টার ব্যবহার করতে পারেন (এবং আপনি একটি বরাদ্দ করতে পারবেন না)
ratchet freak

3
@ratchetfreak: না, খালি ( struct foo{};) অনুমোদিত নয়, তবে এগিয়ে ঘোষণা ( struct foo;) রয়েছে।
এমসাল্টার্স

@ এসএমএলটাররা যা বলতে চাইছিলাম
ফ্রিক

1
আমাকে একটি খারাপ দিক যুক্ত করুন: * .h ফাইলে প্রাইভেট ফাংশন শিরোনামগুলি লেখাই অনেক সময় ব্যয়। (এক মুহুর্তের জন্য বন্ধুর ক্লাসগুলি ভুলে)
জনি 4

উত্তর:


68

এটি কারণ কারণ ইনস্ট্যান্টেশনে সঠিক পরিমাণ মেমরির বরাদ্দ করতে সি ++ সংকলক অবশ্যই শ্রেণীর প্রকৃত আকারটি জানতে হবে। এবং আকারটিতে সমস্ত সদস্য এবং ব্যক্তিগত সদস্যও অন্তর্ভুক্ত রয়েছে।

ওয়ান ওয়ে এই ব্যবহার করছে এড়াতে Pimpl বাগ্ধারা , সপ্তাহের সিরিজ তার গুরু ঔষধি Sutter দ্বারা ব্যাখ্যা # 24 এবং # 28

হালনাগাদ

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


এই ধরণের তথ্য কি কেবল ক্লাস লাইব্রেরিতে থাকে না? এটি সংযোগের জন্য ব্যবহার করা হয়?
সাইমন বার্গোট

@ সিমন, "ক্লাস লাইব্রেরি" বলতে কী বোঝ?
প্যাটার টারিক

আমার অর্থ শ্রেণি সংজ্ঞা এবং পদ্ধতিগুলি সহ অবজেক্ট ফাইলগুলির সংগ্রহ
সাইমন বার্গোট

7
যখন সি ++ তৈরি করা হয়েছিল তখন এটিএন্ডটি / টি / বেল ল্যাবগুলি (সেই সময়ে স্ট্রোপস্পস নিয়োগকারী) অবশ্যই বড় আকারের সি বিকাশের অভিজ্ঞতা অর্জন করেছিল। তাদের 5 এসইএস ফোনের স্যুইচ সফ্টওয়্যারটি তখন সম্ভবত বিশ্বের বৃহত্তম সিঙ্গল সি প্রোগ্রাম ছিল। ওও সম্পর্কে প্রাথমিক ধারণাগুলি সেই কোড বেসটিতে ইতিমধ্যে দৃশ্যমান এবং সিফ্রন্ট সেই কৌশলগুলি নকল করেছে। তবে ধারণাটি privateআরও আধুনিক।
MSalters

1
সি তে, আপনি কেবল একটি লাইব্রেরির ফাংশনে বরাদ্দকারীকে রাখবেন; ক্লায়েন্ট মোটেই এ জাতীয় কাঠামো বরাদ্দ করতে সক্ষম হবে না। এটি ওভারহেডকে কিছুটা বাড়িয়ে দেয় তবে কোডটিকে ভার্সনগুলিতে অপসারণ করে তোলে তাই এটি প্রায়শই সার্থক। তবে এটি একটি কোড শৈলীতে নিয়ে যায় যা সি ++ এর সাথে দেখা থেকে একেবারেই আলাদা।
ডোনাল ফেলো 14

15

ক্লাসের সংজ্ঞাটি যেখানে আপনি শ্রেণীর কোনও অবজেক্ট ব্যবহার করেছেন সেখানে মেমরিতে অভিন্ন লেআউট তৈরি করতে সংকলকটির পক্ষে পর্যাপ্ত পরিমাণের প্রয়োজন। উদাহরণস্বরূপ, কিছু দেওয়া হয়েছে:

class X { 
    int a;
public:
    int b;
};

সংকলকটি সাধারণত aঅফসেট 0 এবং bঅফসেটে থাকবে 4। সংকলক যদি এটি ঠিক দেখেছে:

class X { 
public:
    int b;
};

এটি হবে "মনে হয়" যে bএ 0 অফসেট করা উচিত পরিবর্তে যখন সংজ্ঞা নির্ধারিত ব্যবহার কোড অফসেট 4. b, কোড প্রথম সংজ্ঞা ব্যবহার দেখতে চাই aপরিবর্তিত পেতে, এবং তদ্বিপরীত।

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


1
আমি একটি নকশা সিদ্ধান্ত সম্পর্কে জিজ্ঞাসা করছি। অবশ্যই ভাষাটি কাজ করার জন্য আপনার ব্যক্তিগত সদস্যের ঘোষণা কোথাও রাখা দরকার। তবে কেন এটি হেডারে থাকা উচিত এবং আরও ব্যক্তিগত জায়গায় নয়?
সাইমন বার্গোট

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

3
তবুও, একটি তুচ্ছ নিয়ম এই জাতীয় ".cpp- সংজ্ঞায়িত" বেসরকারী সদস্যদের শেষ বরাদ্দ করা হবে। এর অর্থ পাবলিক এবং "সাধারণ" বেসরকারী সদস্যদের অফসেটগুলি তাদের উপর নির্ভর করবে না। আইএমওর আসল কারণ হ'ল আপনি এ জাতীয় শ্রেণীর উত্তরাধিকারী হতে পারবেন না, যেহেতু উত্পন্ন অংশটি সেই ব্যক্তিগত সদস্যদেরও অনুসরণ করতে হবে।
MSalters

3

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

নির্ভরশীল ফাইলগুলির পুনঃসংকলন আপনার অন্তর্ভুক্ত কাঠামোর উপর নির্ভর করে। অন্য হেডারের পরিবর্তে একটি .cpp ফাইলে .h ফাইলগুলি অন্তর্ভুক্ত করা কিছু ক্ষেত্রে পুনরায় সংশোধনের দীর্ঘ শৃঙ্খলা রোধ করতে পারে।

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