আমি সি ++ হেডার ফাইলগুলি ঘৃণা করি তবে কী করবেন?


25

আমি সর্বদা হেডার ফাইলগুলি সম্পর্কে বিভ্রান্ত ছিলাম। এগুলি এত অদ্ভুত: আপনি .h ফাইল অন্তর্ভুক্ত করুন যা .cpp অন্তর্ভুক্ত করে না কিন্তু .cpp কোনওভাবে খুব সংকলিত হয়।

সম্প্রতি আমি একটি টিম প্রকল্পে যোগ দিয়েছি এবং অবশ্যই .h এবং .cpp উভয়ই ব্যবহৃত হয়।
আমি বুঝতে পারি যে এটি খুব গুরুত্বপূর্ণ, তবে আমি আমাদের প্রতিটি বহুবিধ শ্রেণীর প্রতিটি ফাংশন ঘোষণার অনুলিপি-পেস্ট করে বাঁচতে পারি না।

আমি কীভাবে 2-ফাইল কনভেনশন দক্ষতার সাথে পরিচালনা করব?
এটিতে সহায়তা করার জন্য কি কোনও সরঞ্জাম রয়েছে বা নীচের উদাহরণ হিসাবে দেখতে এমন একটি ফাইল স্বয়ংক্রিয়ভাবে .h এবং .cpp এ পরিবর্তন করতে পারে? (বিশেষত এমএস ভিসি ++ ২০১০ এর জন্য)

class A
{
...
    Type f(Type a,Type b)
    {
        //implementation here, not in another file!
    }
...
};

Type f(Type a)
{
     //implementation here
}
...

8
এই প্রশ্নটি বেশ কয়েকটি উপায়ে যেতে পারে .. "সি ++ ব্যবহার করার সময় আমাদের কেন শিরোনামের প্রয়োজন হয়" বা "আপনি কি মনে করেন যে একটি আধুনিক ভাষা সংকলিত হতে বোঝা উচিত শিরোনাম ব্যবহার করা উচিত?" যেমনটি রয়েছে, এর শিরোনামে 'আমি কী করব' এবং "ঘৃণা" রয়েছে, যা পতাকাগুলির
টিম পোস্ট

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

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

5
কি করো? এটি আপনাকে এতটা বাগ দিলে অন্য কোনও ভাষা সন্ধান করুন।
পল নাথান

5
"অনুলিপি-পেস্টিং সহ বাঁচতে পারে না" সম্পর্কে: যখনই কেউ কোনও ফাংশন আপডেট করে, যে কোনও স্থানে যেখানেই বলা হয় সেখানে স্থান আপডেট করতে হবে। যেহেতু কলকারীরা হেডার ফাইলটিতে ঘোষণার চেয়ে অনেক বেশি কঠিন, তাই শিরোনামটি আপডেট করা কেবল একটি সামান্য বিশদ।
সুজোরড

উত্তর:


15

আরও রিফ্যাক্টরিং বন্ধুত্বপূর্ণ সি ++ রচনা করা

C ++ আপনি না আছে এ সব হেডার ব্যবহার করতে। আপনি সি # বা জাভা দিয়ে ঠিক একই ফাইলটিকে একটি ফাইলে সংজ্ঞায়িত করতে পারেন। সি বিকাশকারীরা সাধারণত একটি শিরোনাম ফাইলে বাহ্যিক কলগুলি রাখবে। সমস্ত অভ্যন্তরীণ কলগুলি .c ফাইলটিতে সংজ্ঞায়িত করা হবে। একই টোকেন দিয়ে, আপনি ক্লাস / ইন্টারফেস (খাঁটি ভার্চুয়াল অ্যাবস্ট্রাক্ট ক্লাস) / ইত্যাদির জন্য আপনার সি ++ .h ফাইলগুলি সংরক্ষণ করতে পারেন। যেগুলি ডিএলএল এর বাইরে ভাগ করে নেওয়া উচিত। অভ্যন্তরীণ ক্লাস / স্ট্রাক্ট / ইন্টারফেস ইত্যাদির জন্য আপনি কেবল আপনার প্রয়োজনীয় .cpp ফাইল অন্তর্ভুক্ত করবেন:

#include<myclass.cpp>

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

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

আপনি এই প্রশ্নটিও দেখতে চাইতে পারেন: সি ++ এর জন্য ভাল রিফ্যাক্টরিং সরঞ্জাম

কীভাবে সি / সি ++ শিরোনাম / বাস্তবায়ন ফাইলগুলি সমাধান করে

বেস সি স্তরে (এবং সি ++ সেই ভিত্তিতে নির্মিত), শিরোনাম ফাইলগুলি কোনও ফাংশন / স্ট্রাক্ট / ভেরিয়েবলের প্রতিশ্রুতি ঘোষণা করে যা একটি সংকলককে অবজেক্ট ফাইল তৈরি করার অনুমতি দেওয়ার জন্য যথেষ্ট। একইভাবে সি ++ শিরোনাম ফাইলগুলি ফাংশন, স্ট্রাক্ট, ক্লাস ইত্যাদির প্রতিশ্রুতি ঘোষণা করে এটি সংজ্ঞাটি স্ট্যাকের মধ্যে স্থান সংরক্ষণ করার জন্য ইত্যাদি ব্যবহার করে etc.

.C বা .cpp ফাইলগুলির প্রয়োগ রয়েছে। সংকলক প্রতিটি বাস্তবায়ন ফাইলকে কোনও অবজেক্ট ফাইলে রূপান্তর করার সাথে সাথে অবিযুক্তি ধারণাগুলিতে (শিরোনামে কী ঘোষণা করা হয়েছিল) হুক রয়েছে। লিঙ্কার হুক্সকে অন্য অবজেক্ট ফাইলে প্রয়োগের সাথে সংযুক্ত করে এবং একটি বৃহত বাইনারি তৈরি করে যা সমস্ত কোড (ভাগ করা লাইব্রেরি বা এক্সিকিউটেবল) অন্তর্ভুক্ত করে।

ভিএস স্পেসিফিক

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


সমস্যাটি হ'ল, আমি সব সময় ক্লাসগুলি ভারীভাবে সংশোধন করে চলেছি, কেবল নতুন ফাংশন ইত্যাদি সংযোজন করছি না
ওলেহ প্রাইপিন

5
@ ব্ল্যাকস্পিরিট: তো, আপনি কেন সারাক্ষণ ভারী ক্লাসগুলি সংশোধন করছেন? ওও ডিজাইনের পিছনে অন্যতম ধারণা হ'ল প্রচুর স্থিতিশীল বিল্ডিং ব্লক। আমি যদি ভারীভাবে ক্লাসগুলি সংশোধন করতাম তবে আমি প্রচলিত লিস্প বা পাইথনের মতো আরও গতিশীল ভাষা চাই।
ডেভিড থর্নলি

2
ওটা সেটা, যা আমি করছি. আমি "বিল্ডিং ব্লকগুলি" উন্নত / সংশোধন করছি এবং নতুনগুলি যুক্ত করছি
ওলেহ প্রাইপিন

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

@ বেরিন: আমি এক বা দু'বছর আগে সি ++ রিফ্যাক্টরিং সরঞ্জামগুলি সন্ধান করেছি এবং দুটি জিনিস পেয়েছি। এ সময় তারা মোটামুটি দামি ছিল এবং আমি পরীক্ষার সংস্করণগুলি দেখতে পাইনি, তাই তারা কী করেছিল তা আমি জানি না। তদুপরি, একজন কেবল ইমাস নিয়ে কাজ করেছিল, যা ভিজ্যুয়াল স্টুডিওর দোকানে তার কার্যকারিতা সীমাবদ্ধ করে।
ডেভিড থর্নলি

13

জাভা বিকাশকারী হয়ে উঠুন।

আপনার যদি সত্যই সি ++ তে বিকাশ চালিয়ে যেতে হয় তবে আপনি একটি আইডিই ব্যবহার করে দেখতে পারেন। প্রায়শই তারা কিছু ব্যবস্থার প্রস্তাব দেয় যার দ্বারা আপনি কোনও শ্রেণিতে একটি পদ্ধতি যুক্ত করতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে .h ফাইলটিতে ঘোষণা এবং .cpp ফাইলে সংজ্ঞা রাখে।


2
kthx, আমি কিছুটা জাভা জানি, কিন্তু আপনি এটি দিয়ে নিম্ন-স্তরের উইন 32 ডিএলএল তৈরি করতে পারবেন না, আপনি কি পারেন?
ওলেহ প্রিপিন

41
কেন জানি না, তবে 'জাভা বিকাশকারী হয়ে উঠুন' একরকম অবমাননার মতো শোনাচ্ছে: ডি।
অলিভার ওয়েইলার

2
আপনি যদি নিম্ন স্তরটি করতে চান তবে 'সহজ ভাষাগুলি' সম্পর্কে সবকিছু ভুলে যান। নিম্ন স্তরের ব্যয় ঘাম এবং অশ্রু।
ব্যাটিবিক্স

5
বিশেষভাবে সহায়ক উত্তর নয়।
ক্রিসএফ

1
@ অলিভারওয়েলার আমি অপমান হিসাবে "জাভা বিকাশকারী" হয়ে উঠতে পারি না। আমি সি ++ এবং জাভা উভয় ক্ষেত্রেই প্রোগ্রাম করি তবে এখন পর্যন্ত আমার পছন্দ জাভা কারণ এটি বসে থাকা এবং কোডটি কার্যকর করা (যা আরও বহনযোগ্য) কার্যকর করা খুব সহজ। যদি আপনি কোনও কারণে শিরোলেখের ফাইলগুলির অস্তিত্বকে ঘৃণা করেন তবে জাভা চেষ্টা করা সঠিক পছন্দ হতে পারে (যদিও এটি অদ্ভুতরূপে আপনি শিরোনামের ফাইলগুলি ঘৃণা করবেন; আমি আইডিইতে পরিবর্তন বিবেচনা করব)।
ট্রিক্সি ওল্ফ

7

আপনি আগ্রহী হতে পারে makeheaders Hwaci থেকে প্রোগ্রামটি (যারা SQLite এবং জীবাশ্ম না)।

এছাড়াও কটাক্ষপাত আছে কিভাবে জীবাশ্ম নির্মিত হয় একটি ধারণা আছে।


5
প্রশ্নকারীকে এখনও .h এবং .cpp এর মধ্যে সম্পর্কটি বেশ ভালভাবে বুঝতে হবে।
জব

2
আমি বুনিয়াদি বুঝতে পারি। উত্তরটি আমার যা প্রয়োজন ঠিক তা মনে হচ্ছে।
ওলেহ প্রাইপিন

4

আপনি যখন নতুন ক্লাসের প্রথম লাইনগুলি লিখেন, সাধারণত এটি হয় কারণ আপনার কেবল তখন এক জায়গায় প্রয়োজন হয়। পরবর্তী সময়ে, এটি আরও স্থানে ব্যবহৃত হতে পারে তবে প্রাথমিকভাবে এটি সাধারণত হয় না।

আমার অনেকগুলি ক্লাস বর্তমান .cpp ফাইলের শীর্ষে শুরু হয়। এটি একাধিক জায়গায় এটি ব্যবহারের জন্য পর্যাপ্ত স্তম্ভিত হয়ে গেলে, আমি এটি একটি শিরোনামে কাটা-পেস্ট করি। যদিও প্রায়শই ক্লাসটি উপস্থিত হওয়ার সাথে সাথে অদৃশ্য হয়ে যায়।


-1

সি ++ হেডার ফাইলগুলি পরিচালনা করতে সহায়তা করার পরামর্শ হিসাবে ফাইল এক্সটেনশন বা ফাইল প্রত্যয় ছাড়াই এগুলি ব্যবহার করা সাধারণ, যেমন "জিসিসি" লাইব্রেরিগুলি করে।

যদি এটি আপনার ক্ষেত্রে হয় তবে আমি একটি " .hpp" (বা আনলাস্ট " .hxx") ফাইল এক্সটেনশন বা ফাইল প্রত্যয় ব্যবহার করার পরামর্শ দিই

আপনাকে আপনার সংকলক, বিকাশকারী পরিবেশ বা বিল্ট প্রোগ্রামটি কনফিগার করতে হবে।


3
আপনি যখন এই জাতীয় ফাইল অন্তর্ভুক্ত করবেন তখন কীভাবে কথা বলছেন #include <iostream>? এগুলি কেবল জিসিসি গ্রন্থাগারের জন্য নয়। আসলে, এটি 1997 সি ++ স্ট্যান্ডার্ড , বিভাগ 17.3.1.2 এ সংজ্ঞায়িত হয়েছে । আমি ফাইলগুলির নামকরণ এড়াতে চাই। আপনি পারেন তবে সি ++ স্ট্যান্ডার্ড লাইব্রেরিটি কারণটি সম্ভবত নামকরণের বিরোধগুলি এড়ানোর জন্য করেছিল। যখন আপনি একটি শিরোনাম অন্তর্ভুক্ত করেন তখন সংকলকরা স্বয়ংক্রিয়ভাবে একটি '.h' যুক্ত করলে আমি এটি সত্যিই অদ্ভুত বলে মনে করি it এবং আমি সি ++ স্ট্যান্ডার্ড লাইব্রেরি ছাড়া প্রত্যয় ছাড়া কারও নাম শিরোনাম দেখতে পাচ্ছি না।
वेग

1
এছাড়াও, আমার মনে রাখা উচিত, বোরল্যান্ড (যা আমি খুব ঘৃণা করি) ব্যতীত আমি যে সমস্ত সংকলক ব্যবহার করেছি সেগুলি স্বয়ংক্রিয়ভাবে '। H' বা '.hpp' বা '.hxx' যুক্ত করবেন না যখন আপনি চেষ্টা করবেন কোনও প্রত্যয় ছাড়াই একটি ফাইল অন্তর্ভুক্ত করতে। সমস্ত সংকলক #include <someclass>হিসাবে পড়তে আশা করবেন না #include <someclass.hpp>। আপনার কোডটি ভঙ্গ হবে।
वेग
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.