সি ++ ব্যবহার করছেন তবে ভাষার নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার করছেন না, সিটিতে স্যুইচ করা উচিত?


16

আমি আমার নিখরচায় শখ হিসাবে একটি এনইএস এমুলেটর বিকাশ করছি। আমি সি ++ ব্যবহার করি কারণ আমি যে ভাষাটি বেশিরভাগ ক্ষেত্রেই ব্যবহার করি, বেশিরভাগই এবং বেশিরভাগ ক্ষেত্রেই পছন্দ করি।

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

পারফরম্যান্স অর্জনের জন্য আমি এটি করব না, এটি পার্শ্ব প্রতিক্রিয়া হিসাবে আসতে পারে, তবে ধারণাটি কেন আমার প্রয়োজন না হলে আমি কেন সি ++ ব্যবহার করব?

আমি ব্যবহার করছি সি ++ এর একমাত্র বৈশিষ্ট্য হ'ল ক্লাসগুলি ডেটা এবং পদ্ধতিগুলি encapsulate করার জন্য, তবে এটি স্ট্রাক্ট এবং ফাংশনগুলির সাথেও করা যেতে পারে, আমি নতুন ব্যবহার করছি এবং মুছে ফেলছি, তবে পাশাপাশি malloc এবং বিনামূল্যে ব্যবহার করতে পারে, এবং আমি কেবল কলব্যাকের জন্য উত্তরাধিকার ব্যবহার করে যা ফাংশনগুলির পয়েন্টার দিয়ে অর্জন করা যেতে পারে।

মনে রাখবেন, এটি একটি শখের প্রকল্প, আমার কোনও সময়সীমা নেই, সুতরাং ওভারহেড সময় এবং কাজ যাতে পুনরায় লেখার প্রয়োজন হয় তা সমস্যা নয়, মজাও হতে পারে। তাহলে, প্রশ্নটি সি বা সি ++?


3
আমার কাছে মনে হচ্ছে আপনি ইতিমধ্যে নিজেকে উত্তর দিয়েছেন: আপনার যদি কেবল সি প্রয়োজন হয় তবে কেন সি ++ ব্যবহার করবেন? অনেকগুলি পরিস্থিতি রয়েছে যেখানে সি পুরোপুরি ঠিক আছে।
জর্জিও

3
@ জর্জিও: এবং সেগুলি প্রথম ষাট সেকেন্ড পরে বাষ্পীভূত হয় এবং আপনাকে আপনার কোড বজায় রাখা দরকার।
ডেড এমএমজি

7
I use C++ because is the language I use mostly, know mostly and like mostly.এবং এটিই আপনার প্রশ্নের উত্তর। আপনার বর্তমান ভাষাটি সমাধান করতে পারে না এমন সমস্যা কেবল তখনই আপনার মাঝারি প্রকল্পগুলিতে ভাষা পরিবর্তন করা উচিত। I don't use templates, operator overloading, polymorphism, inheritance.সিতে স্যুইচ করার চেয়ে ধারণাগুলি শেখা এবং ব্যবহার করা অনেক বেশি মূল্যবান হবে কারণ যেহেতু এটি একটি শখের প্রকল্প, আপনি আগে ব্যবহার করেননি এমন কয়েকটি জিনিস কেন ব্যবহার করবেন না? আপনি সর্বদা সিতে অন্য একটি প্রকল্প শুরু করতে এবং ভাষাটি শিখতে পারেন তবে আপনার বর্তমান প্রকল্পের জন্য এটি স্যুইচ করার কোনও মানে হয় না।
ইয়ানিস

4
আমি লিখি প্রতিটি প্রকল্পে আমি 100% ভাষার ব্যবহার করি না। আপনি সি ++ কে সবচেয়ে ভাল জানেন, আপনি এমন বৈশিষ্ট্যগুলি ব্যবহার করার ভাল কারণ খুঁজে পেতে পারেন যা আপনি আগে ব্যবহার করেন নি। আপনি সি ++ চিকিত্সা অনেক নিরাপদ সি যেমন, একবার আপনি মান গ্রন্থাগার কাপড় ব্যবহার শুরু এবং বুস্ট নির্মান পছন্দ শুরু করতে পারেন std::shared_ptr, std::unique_ptr, boost::scoped_ptr, std::vector, std::deque, std::mapকলব্যাক কাজকর্মের জন্য ইত্যাদি, functors ব্যবহার দেখব, আর সি ++ 11, আপনি ল্যাম্বদা ফাংশনগুলির মতো জিনিসগুলিও ব্যবহার শুরু করতে পারে।
wkl

3
@ জর্জিও: হ্যাঁ অসীম সংযুক্ত তালিকার ঘূর্ণায়মান অপ্রয়োজনীয় ত্রুটি তৈরি করতে বাধ্য।
ডেড জিএমজি

উত্তর:


40

আপনি এখন এটি ব্যবহার হয় না, কিন্তু পরের বার আপনি যখন মেমরির লিক বা একটি ডবল মুছুন, তোমার কাছে ফিরে আসার জন্য ভিক্ষা করা হবে পেতে std::vector<T>, std::unique_ptr<T, Del>এবং std::shared_ptr<T>, যা সমাধান করতে পারে যারা সমস্যার প্রায় জাভাস্ক্রিপ্টে গার্বেজ easily-। যারা সি ওভার সি ++ ব্যবহার করেন তাদের প্রত্যেকের ক্ষেত্রে এটি ঘটবে, এবং চৌকসগুলি কেবল ওপরে যাওয়ার আগে বাগগুলি পপ আপ হওয়ার অপেক্ষা রাখে না।

যে কোডগুলি ব্যবহার করে newএবং deleteসরাসরি প্রকৃতপক্ষে সি ++ তে অন্তর্ভুক্ত নয়, এটি সেই ধরণের অর্ধেক বাড়ির সাথে সম্পর্কিত যা আমরা "ক্লাস সহ সি" হিসাবে উল্লেখ করি। ভাষাটি 1985 সালে ছিল সেখানে। এটি সি ++, সার্কা ২০১১-এর মতো বিশেষভাবে মিল নয় all সমস্ত সম্ভাবনার মধ্যেই আপনি যেখানেই সি ++ শিখেন কেবল এটি খুব ভালভাবে শেখায়নি something এমন একটি বিষয় যা দুর্ভাগ্যবশত বরং সাধারণ-এবং আরও ভাল শিক্ষার সাথে আপনি পাবেন would এই বৈশিষ্ট্যগুলির ব্যবহার সন্ধান করুন।

বিশেষত, আমি উপরে তালিকাভুক্ত হিসাবে, সি ++ এর জেনেরিক ডেটা স্ট্রাকচার এবং রিসোর্স-ম্যানেজিং ক্লাসগুলি কেবল সিটির যে কোনও প্রস্তাবের চেয়ে মৌলিকভাবে বৃহত্তরতর। আপনি যদি গতিশীলভাবে বরাদ্দ হওয়া অ্যারে চান, তবে ব্যবহার করুন std::vector<T>। এটি একটি দুর্দান্ত সাধারণ ব্যবহারের কেস। আপনি যদি সেগুলি ব্যবহার না করে থাকেন তবে আপনার কোডটি অকারণে ত্রুটির বিপদ-বিশেষত রিসোর্স ম্যানেজমেন্ট সম্পর্কিত। সি ++ এমনভাবে সুরক্ষা এবং পুনরায় ব্যবহার কোডটি গ্যারান্টি দিতে পারে যাতে সি কখনই স্পর্শ করতে পারে না।

তবে আমি মনে করি আপনিও খুব বেশি আশা করতে পারেন। টেমপ্লেট এবং অপারেটর ওভারলোডগুলি গ্রন্থাগার গ্রাহকদের জন্য সাধারণ নয়। যদি আপনার কোড ব্যবহার করে তবে std::vector<T>তা করতে আপনার কোনও টেমপ্লেট লেখার দরকার নেই । যদি আপনার কোড ব্যবহার করে তবে std::stringকেউ আপনাকে অপারেটরদের ওভারলোড করতে বাধ্য করছে না। আপনাকে কেবল লিখতে std::vector<T> এবং সেগুলি করতে হবে std::string- তবে আপনি সেগুলির পুরো সুবিধা নিতে পারেন।

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

এছাড়াও, সি ওভার সি ++ এ পারফরম্যান্সে কোনও লাভ নেই।


1
@ জর্জিও: make_sharedবিদ্যমান, এবং আপনি একটি তুচ্ছ make_uniqueটেম্পলেট লিখতে পারেন যা একই কাজ করে। এটি নিরাপদ।
ডেড এমএমজি

4
দুর্দান্ত উত্তর। মাথায় পেরেক। আমাদের ছোট্ট লাইব্রেরিগুলির জন্য সি ++ সর্বাধিক মূল্যবান যা আমাদের সর্বদা ব্যবহার করা উচিত।
আন্দ্রে জান ট্যাক

2
@ জর্জিও: এটি অনিরাপদ কারণ কারণ এরকম একাধিক যুক্তি কল করার সময় আপনি ব্যতিক্রমের ক্ষেত্রে মেমরি ফাঁস পেতে পারেন এবং make_sharedআরও দক্ষ। কেবলমাত্র কারখানার ফাংশনগুলি গ্যারান্টিযুক্ত ব্যতিক্রম নিরাপত্তা দিতে পারে।
ডেড জিএমজি

6
@ টিপি 1: ডাব্লুটিএফ? ইংরাজীতে, দয়া করে
ডেডএমজি

2
@ লোহরিস আপনার সাধারণ জ্ঞানের জন্য উদ্ধৃতি দেওয়ার দরকার নেই। কোন উপায়ে সি ++ এর চেয়ে বেশি পারফরম্যান্ট হওয়া উচিত?
ক্রিস বলেছেন পুনর্নির্মাণ মনিকা

7

এমনকি আপনি সি ++ নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার না করলেও, সি ++ এর কঠোর প্রকারের সিস্টেমের কারণে একটি সি ++ সংকলক সি-এর চেয়ে বেশি সমস্যার মুখোমুখি হবে।


6

আমি অন্য দিক থেকে এটি তাকান হবে। আপনি কি সিটিতে কোডটি লিখে আবার কিছু অর্জন করবেন ? এমনকি খাঁটি শখের প্রকল্পেও এর মতো পুনর্লিখনের সাথে একটি ব্যয় যুক্ত রয়েছে। আমার ধারণা মতো আর কিছুই না থাকলে সুযোগ ব্যয় বলে অভিহিত করা হবে - যেমন, আপনি যদি সিতে পুনরায় লেখার সময় নষ্ট না করে থাকেন তবে সেই সময় আপনি অন্যান্য কাজগুলি করতে পারতেন if

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

সংক্ষেপে, আপনি যদি সি তে পুনরায় লেখার দ্বারা সত্যিকারের উপকারটি সরবরাহ না করেন তবে অনিবার্যভাবে আরও অনেক ভাল কাজ করার দরকার রয়েছে।


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

1

আরও সাধারণ উত্তর হিসাবে:

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


1

শখের বিকাশের জন্য, আমি সরল সি সি এবং সি-জাতীয় ভাষাগুলিতে ছোট শখের বিকাশ মডিউলগুলিতে সমর্থিত হওয়ার সম্ভাবনা বেশি বলে বিবেচনা করব।

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


1

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

"আমি ব্যবহার করছি সি ++ এর একমাত্র বৈশিষ্ট্য হল ডেটা এবং পদ্ধতিগুলি encapsulate করার ক্লাসগুলি, তবে এটি স্ট্রাক্ট এবং ফাংশনগুলির সাথেও করা যেতে পারে,"। এটি সত্য নয়। structsসি তে এনক্যাপসুলেশন সমর্থন করে না এবং এতে ফাংশন (পদ্ধতি) থাকতে পারে না - অন্তত ফাংশনগুলিতে পয়েন্টারের মতো কৌশল ব্যবহার না করে। এছাড়াও, সি এর ফাংশনগুলি দুর্বল কারণ সেগুলি ওভারলোড করা যায় না।

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

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


1
structsসিতে, বাস্তবে, encapsulate পদ্ধতিতে ব্যবহার করা যেতে পারে। আপনি কেবল ফাংশন পয়েন্টারগুলির একটি কাঠামো তৈরি করেন এবং আপনি যে কোনও ফাংশন চান তা নির্দেশ করতে তাদের সূচনা করুন। উদাহরণস্বরূপ lxr.linux.no/linux+v3.3/incolve/linux/fs.h#L1598 এ দেখুন ।
রবার্ট মার্টিন

সেটা ঠিক. মন্তব্যের জন্য ধন্যবাদ, আমি উত্তরটি প্রসারিত করেছি।
সাকিস্ক

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

ফাংশনগুলিতে পয়েন্টারগুলি একটি উন্নত সি কৌশল? সত্যি?
ডোনাল ফেলো

@ ডোনালফেলোস আপনি ঠিক বলেছেন, আমি অত্যুক্তি দিয়েছি। উন্নত সরানো হয়েছে ... :)
সাকিস্ক

0

আমি খুব শিক্ষানবিস, সুতরাং এখানে আমার 2 বিট আসে।

আমি কিছু ভাল বেসিক ভিডিও টিউটোরিয়াল দিয়ে উইবিট.নাট এ সি এবং সি ++ শিখছি, সম্ভবত তারা "পরিস্থিতি" (একটি বিজ্ঞাপন নয়!) এর ওভারভিউ নিতে আপনাকে অনেক সহায়তা করতে পারে

আমি আপনাকে সিতে পরিবর্তিত হওয়ার পরামর্শ দিচ্ছি, কেবল শিখতে, আপনি যেমন শখের শিকার হন, সমস্যাটি নয়, এটি একটি পরিতোষ হবে।

আমি আরও পরামর্শ। উভয় ভাষায় এটি করুন। আপনি যে উপায় এবং সমাধানগুলি খুঁজে পাবেন এবং ব্যবহার করবেন তার তুলনা করুন। আমি নিশ্চিত আপনি আশা করছেন এটি "এত সহজ" হবে না ... তবে আপনি অনেক কিছু শিখবেন তা নিশ্চিত!


1
আপনাকে অনেক ধন্যবাদ, কিন্তু আমি শিখছি না, আমি ইতিমধ্যে সি এবং সি ++ জানি, আমি এই নির্দিষ্ট প্রকল্পের জন্য কোনটি ব্যবহার করব তা জিজ্ঞাসা করছি।
পেট্রুজা

উফ, আমার শেখার সময়! = পি
এইচ_7

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

-1

এখানে সি ++ বনাম সি এর উপকারিতা এবং বিপরীতে রয়েছে:

  1. সি-তে সরানো পছন্দসই সি ++ সাবসেটের মধ্যে থাকা সহজ করে দেয়, কারণ কম্পাইলার তখন এর বাইরে গেলে ত্রুটি দেয়। মূল সমস্যা যদি সিদ্ধান্ত নেওয়া সাবসেটের মধ্যেই থাকে তবে এই বিকল্পটি বেছে নেওয়া উচিত। (কেন আমাদের এটির জন্য সংকলক সমর্থন নেই?)
  2. একবার আপনি নির্বাচিত সি ++ বৈশিষ্ট্য উপসেটের মধ্যে থাকতে পারেন, তারপরে পরবর্তী জিনিসটি কোডটি ভঙ্গকারী খারাপ কনভেনশনগুলি থেকে মুক্তি পেতে সাবসেটটি পরিবর্তন করার চেষ্টা করবে। এর জন্য পুরো সি ++ ব্যবহার প্রয়োজন।
  3. একবার আপনার উভয় "সাবসেটের ভিতরে থাকা" এবং "এটি একটি ভাল উপসেট" হয়ে গেলে সি ++ বৈশিষ্ট্যের বাইরে চলে যান এবং প্রয়োজনীয়তাগুলি নিয়ে ভাবতে শুরু করুন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.