সি ++ বন্ধুর কাছে না বন্ধুর কাছে


19

কলেজটিতে এই সেমিস্টারে সি ++ কোর্স সহ আমার একটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং রয়েছে এবং আমরা বন্ধু ফাংশন সম্পর্কে শিখছিলাম।

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

একজন ওওপিএস বিশেষজ্ঞ সি ++ তে বন্ধু ফুকশন সম্পর্কে কী বলবেন? আমি কি কেবল এটির উপর নজর রেখেছি বা আমার এ সম্পর্কে আরও শিখানো উচিত?


@ সমস্ত: দুর্দান্ত উত্তর এবং মন্তব্যগুলি, এটি শেখার এই দুর্দান্ত উপায়, পাঠ্যপুস্তকে এই জাতীয় বিবরণে বন্ধুদের সম্পর্কে আমি জানতে পারি না।
নিখিল

উত্তর:


13

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

 double a;
 Vector v, w;
 w = v * a;

আমরা সদস্য ফাংশন দিয়ে এটি করতে পারি:

public class Vector {
 ...
 Vector operator*(double a);
}

তবে আমরা লিখতেও চাই:

w = a * v

এটির জন্য একটি ফ্রি ফাংশন প্রয়োজন:

 Vector operator*(double a, Vector v)

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

একইভাবে আমরা friendসংকলন এবং পুনরাবৃত্তির মতো দৃ tight়ভাবে সংযুক্ত ক্লাসগুলির প্রয়োগ সহজ করতে ব্যবহার করতে পারি । আবার, আমি উভয় শ্রেণিকে একই শিরোনামে ঘোষণা করব এবং তাদের একই উত্স ফাইলে প্রয়োগ করব।


3
"এটির জন্য একটি ফ্রি ফাংশন প্রয়োজন" requires না, এটা না: inline Vector operator*(double a, Vector v) { return v*a; }। আসলে ক্যানোনিকাল সমাধান।
এমসাল্টারস

1
@ এসএমএলটার্স: ভাল কথা। আমি একটি খারাপ উদাহরণ বেছে নিয়েছি। আমি মনে করি আপনার ইনলাইন ফাংশন সংজ্ঞা অনুসারে একটি বিনামূল্যে ফাংশন, তবে কোনও বন্ধু ঘোষণার প্রয়োজন নেই।
কেভিন

4
@ এসএমএলটার্স: এটি কেবলমাত্র বৈধ তবেই * যদি a এবং v (x) এর পরিবর্তনমূলক সম্মান হয়। যদি ভেক্টরের উপাদানগুলি জেনেরিক হয় (অগত্যা স্ক্যালার নয়) আপনাকে অপারেন্ডের অর্ডারটি রাখতে হবে
এমিলিও গারাভাগলিয়া

এটি বেশ তাত্ত্বিক। সম্ভবত একমাত্র প্রচলিত অ-পরিবহনের ক্ষেত্রে হতে পারে inline Vector operator*(double a, Vector v) { return -v*a; }এবং এর জন্য এখনও বন্ধুত্বের প্রয়োজন হয় না।
এমএসএলটাররা

16

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

friendআপনি সর্বজনীন হতে চান না এমন কিছু করার জন্য বাধ্য হওয়ার চেয়ে একক ক্রিয়াকলাপের পক্ষে এটি আরও ভাল । তার মানে পুরো বিশ্ব এটি ব্যবহার করতে পারে - কেবল একটি ফাংশনের পরিবর্তে।


এনক্যাপসুলেশনের ক্ষেত্রে ফ্রেন্ড ফাংশনের জন্য +1 সদস্য ফাংশন থেকে আলাদা নয়। যদিও এটি সর্বজনীন সদস্যের কার্যক্রমে সত্য।
TheFogger

1
@ দ্য ফোগার: যুক্তিযুক্তভাবে, আপনি friendএকটি ফাংশনও করতে পারেন যা "ব্যক্তিগত" যেমন একটিমাত্র টিইউতে ঘোষিত হিসাবে।
ডেডএমজি

5

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


5

" ওওপিএস বিশেষজ্ঞ কী বলবেন ... " এটি বেশিরভাগের উপর নির্ভর করে যে তিনি সি ++ তে কীভাবে বিশেষজ্ঞ, তার নিজস্ব স্পেসিফিকেশন দ্বারা - এটি পিউরিস্টের ভাষা নয় (এবং হতে চান না)।

ওওপি জিলিওটগুলি সি ++ ব্যবহার করে না (তারা স্মার্টটাক পছন্দ করে, এবং জাভা পছন্দ করে)।

কার্যকরী প্রোগ্রামিং জেলোটগুলি সি ++ ব্যবহার করে না (তারা এলআইএসপি এবং এর উত্তরসূরিদের পছন্দ করে)

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

এবং "কার্যকারিতা" স্ট্যান্ড পয়েন্ট থেকে, এর মধ্যে a.fn(b)এবং fn(a,b)কোনও পার্থক্য নেই (যেখানে fnবন্ধু রয়েছে): জড়িত পক্ষগুলি একই রকম। সহজভাবে, এক সিনট্যাক্স অন্য চেয়ে বেশি উপযুক্ত হতে পারে: যদি FN সংক্রান্ত হয় বিনিময় করা aএবং b, fn(a,b)তারপর সম্ভবত আরো উপযুক্ত a.fn(b)(। যেখানে একটি সৌন্দর্য একটি "বিশেষ ভূমিকা" যে, আসলে, এটা না হচ্ছে)


1
জাভা পছন্দ করে এমন "ওওপি জেলিয়টস" ওওপি বুঝতে পারেনি। Getters? Setters? ক্লোজারগুলির জন্য কোনও সহজ সিনট্যাক্স নেই? অ্যালান কে-কে প্যারাফ্রেস করতে, তিনি ওওপি কল্পনা করেছিলেন এমনটি নয়।
কনরাড রুডলফ

@ কনরাড: জেলিটরা হ'ল উচ্চতর সীমাহীন সেট set প্রদত্ত জিলিওটের চেয়ে সবসময়ই একজন জিলিওট বেশি জিলিওট থাকে।
এমিলিও গারাভাগলিয়া

আমার উচিৎ বলতে হবে আমাকে উঁচু করা হয়েছে কারণ আমি শেষ প্যারাটি সত্যিই পছন্দ করেছি। প্রচুর বোধ করে।
জুলাইগলন

5

"বন্ধু" কি এনক্যাপসুলেশন লঙ্ঘন করে?

না। না। "বন্ধু" সদস্যতার মতোই অ্যাক্সেস মঞ্জুর করার জন্য একটি সুস্পষ্ট প্রক্রিয়া। আপনি (স্ট্যান্ডার্ড কনফর্মিং প্রোগ্রামে) কোনও শ্রেণীর উত্স পরিবর্তন না করে নিজেকে অ্যাক্সেস দিতে পারবেন না।


2

সি ++ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী সংক্ষিপ্ত হল:

আপনি যখন করতে পারেন তখন কোনও সদস্য এবং যখন আপনাকে করতে হয় একটি বন্ধু ব্যবহার করুন।

প্রায়শই জিজ্ঞাসিত প্রশ্নাগুলি বন্ধুত্ব সম্পর্কে চিন্তাভাবনার অন্যতম কার্যকর উপায় উপস্থাপন করে:

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

সম্ভবত বন্ধু ফাংশনগুলির সর্বাধিক সাধারণ ব্যবহার হ'ল I / O এর জন্য ওভারলোডিং <<


0

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

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


-2

সি ++ ফ্রেন্ড ফাংশনগুলি নীচের কার্যকারিতার সাথে নিবিড়ভাবে সম্পর্কিত:

  1. বিনামূল্যে ফাংশন
  2. স্থির ফাংশন
  3. বন্ধু ফাংশন

এর অর্থ হ'ল তাদের কাছে এই পয়েন্টার নেই এবং সুতরাং তারা শ্রেণি / অবজেক্টের বাইরে। অন্যদিকে, তারা প্রায়শই এমন পরামিতি নেয় যা তাদের আবার শ্রেণীর অন্তর্ভুক্ত করে। লিঙ্কটি স্পষ্ট করে এমন কয়েকটি উদাহরণ এখানে:

class B;
class A {
public:
    friend void f(A &a, B &b);
private:
    int m_a;
};
class B {
public:
   friend void f(A &a, B &b);
private:
   int m_b;
};
void f(A &a, B &b) { /* uses both A's and B's private data */ }

স্ট্যাটিক ফাংশন এবং ফ্রেন্ড ফাংশনগুলির মধ্যে একমাত্র পার্থক্য হ'ল একটি বন্ধু ফাংশন বিভিন্ন ক্লাস ব্যবহার করতে পারে।

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


7
এবং আপনি 10-15 বছর উদ্ভূত কিভাবে?
ডেডএমজি

10-15 বছর সময় থেকে আসে যখন এটি প্রথমত প্রয়োজনীয় হয়।
tp1

3
সুতরাং আপনি নির্বিচারে একটি সংখ্যা তৈরি, তারপর।
ডেডএমজি

3
-1: "আপনার এড়ানো উচিত" " সি ++ এর প্রতিটি বৈশিষ্ট্য একটি সমস্যা সমাধানের জন্য তৈরি করা হয়েছিল। যখন সমস্যা দেখা দেয়, উপযুক্ত বৈশিষ্ট্যটি ব্যবহার করুন।
কেভিন

-1 এর জন্য ধন্যবাদ। এই মন্তব্যের কারণ ছিল was অনুমান করুন এটি কেবল একটি কঠিন ধারণা যে সমস্ত বৈশিষ্ট্য প্রাথমিকের জন্য উপযুক্ত নয়।
tp1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.