কেন একই শ্রেণীর অবজেক্টের একে অপরের ব্যক্তিগত ডেটাতে অ্যাক্সেস থাকে?


99

কেন একই শ্রেণীর অবজেক্টের একে অপরের ব্যক্তিগত ডেটাতে অ্যাক্সেস থাকে?

class TrivialClass {
public: 
  TrivialClass(const std::string& data) :
    mData(data) {};

  const std::string& getData(const TrivialClass& rhs) const {
    return rhs.mData;
  };

private:
  std::string mData;
};

int main() {
  TrivialClass a("fish");
  TrivialClass b("heads");

  std::cout << "b via a = " << a.getData(b) << std::endl;
  return 0;
}

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


18
ভাল, একটি সূচনা পয়েন্ট হিসাবে, আপনি সহজ ক্লাস ব্যতীত অন্য কোনও কপিরাইট-কনস্ট্রাক্টরকে সঠিকভাবে প্রয়োগ করতে সক্ষম হবেন না। আপনি ক্লাসগুলি তাদের নিজস্ব বন্ধু হিসাবে ভাবতে পারেন :-)
ক্যামেরন

4
তাদের গ্রাহকদের কাছ থেকে ব্যক্তিগত চিন্তা করুন, কিন্তু শ্রেণীর সমস্ত কর্মচারীর অ্যাক্সেস রয়েছে
মার্টিন বেকেট

ধন্যবাদ ক্যামেরন এটি উপলব্ধি করে, তবে তবে কেন এই অ্যাক্সেসটি কেবল অনুলিপি নির্মাণকারী এবং অ্যাসাইনমেন্ট অপারেটরগুলির মধ্যে সীমাবদ্ধ নয়?
কিথ

4
একই ধরণের অবজেক্টগুলি প্রায়শই অনেকগুলি ইন্টারঅ্যাক্ট করে। এবং কেউ আপনাকে এমন একটি পদ্ধতি লিখতে বাধ্য করছেন না যা অন্য একটি উদাহরণের ব্যক্তিগত ডেটা বের করে। :)
আঙ্কেলবেন্স

4
কেবল কারণ, সংকলন সময়ে, সংকলকটির একই জিনিসটি সনাক্ত করার কোনও উপায় নেই। এই ধরনের অ্যাক্সেস কার্যকর করার জন্য রানটাইম সমর্থন প্রয়োজন।
চিতান

উত্তর:


80

কারণ এটি সি ++ তে কিভাবে কাজ করে। সি ++ এ অ্যাক্সেস নিয়ন্ত্রণ প্রতি-শ্রেণীর ভিত্তিতে কাজ করে , প্রতি-বস্তুর ভিত্তিতে নয়।

সি ++ এ অ্যাক্সেস নিয়ন্ত্রণ স্থিতিশীল, সংকলন-সময় বৈশিষ্ট্য হিসাবে প্রয়োগ করা হয়। আমি মনে করি এটি বরং সুস্পষ্ট যে সংকলন সময়ে কোনও অর্থ-প্রতি বস্তুর অ্যাক্সেস নিয়ন্ত্রণ বাস্তবায়ন সম্ভব নয়। কেবলমাত্র প্রতি-শ্রেণীর নিয়ন্ত্রণ সেভাবে প্রয়োগ করা যেতে পারে।

প্রতি-বস্তু নিয়ন্ত্রণের কিছু ইঙ্গিত সুরক্ষিত অ্যাক্সেসের নির্দিষ্টকরণে উপস্থিত রয়েছে , যার কারণে এটি স্ট্যান্ডার্ড (11.5) এর নিজস্ব ডেডিকেটেড অধ্যায়ও রাখে। তবে এখনও সেখানে বর্ণিত প্রতি-অবজেক্ট বৈশিষ্ট্যগুলি বরং প্রচলিত রয়েছে। আবার, সি ++ এ অ্যাক্সেস নিয়ন্ত্রণ বলতে প্রতি শ্রেণীর ভিত্তিতে কাজ করা।


9
+1 সি ++ কম্পাইল-টাইম মেকানিজমগুলিতে বড়, রান-টাইম মেকানিজমের ক্ষেত্রে এত বড় নয়। খুব ভাল সাধারণ নিয়ম।
নিমো

4
আপনার "কম্পাইল সময়ে কোনও অর্থ-প্রতি বস্তুর অ্যাক্সেস নিয়ন্ত্রণ বাস্তবায়িত করা সত্যিই সম্ভব নয়"। কেন না? মধ্যে void X::f(X&x), সংকলক সহজেই পার্থক্য করতে সক্ষম this->aএবং x.a। কম্পাইলারের পক্ষে এটি জানা (সর্বদা) সম্ভব নয় *thisএবং xযদি অনুরোধ x.f(x)করা হয় তবে প্রকৃতপক্ষে একই জিনিস , তবে কোনও ভাষা ডিজাইনারকে এই ঠিক আছে বলে আমি খুব ভালভাবে দেখতে পেতাম।
আন্দ্রে কারন

@ অ্যান্ড্রে কারন আমার মনে হয় এটি আসলে মাছের কেটলের অনেক বড় তবে আপনি এটি তৈরি করে ফেলুন। যখন ইনলাইনিং ঘটে না তখন সংকলকটিকে সর্বদা একটি কিনা thisএবং &xএকই কিনা তা পরীক্ষা করে দেখতে হবে । এটা খারাপ আসলে এই এমনকি একটি বিষয় হচ্ছে শেষ পর্যন্ত করা X::f(Y& y), কারণ আমাদের জমাটবদ্ধ বস্তু ধরনের হতে পারে Zউভয় থেকে উত্তরাধিকারী Xএবং Y। সংক্ষেপে এটি একটি বাস্তব জগাখিচুড়ি, পারফরম্যান্ট নয়, এমআই দিয়ে সংবেদনশীলভাবে কাজ করা শক্ত।
নীড় ফ্রিডম্যান

@ নিরিফ্রিডম্যান আমার ধারণা আপনি এই পরামর্শটি ভুল বুঝেছেন। সংকলন করার সময় X::f(X& x), যদি সেখানে প্রবেশাধিকার থাকে তবে x.aএটি সংকলন করে না। আর কিছুই পরিবর্তন হয় না, কোনও চেক beোকানোর দরকার হয় না, তাই স্থির-বৈধ প্রোগ্রামগুলির কার্যকারিতা ক্ষতিগ্রস্থ হয় না। এবং এটি বিদ্যমান সি ++ তে ব্রেকিং হিসাবে প্রস্তাবিত নয়, এমন কিছু হিসাবে যা ডিজাইনাররা privateমূলত পরিচয় করানোর সময় করতে পারতেন ।
আলেক্সি রোমানভ

31

"প্রাইভেট" সত্যিকার অর্থে একটি অ্যাক্সেস নিয়ন্ত্রণ ব্যবস্থা নয় "আমি ফেসবুকে আমার ছবিগুলি ব্যক্তিগত করে রেখেছি যাতে আপনি সেগুলি দেখতে না পান।"

সি ++ এ, "ব্যক্তিগত" কেবলমাত্র এগুলি এমন একটি শ্রেণীর অংশ যা আপনি (শ্রেণীর কোডার) ভবিষ্যতের সংস্করণ ইত্যাদিতে পরিবর্তন করতে পারেন etc. ।

আপনি যদি সত্যিকারের অ্যাক্সেস নিয়ন্ত্রণ চান তবে আপনার যথাযথ ডেটা সুরক্ষা কৌশলগুলি প্রয়োগ করা উচিত।


13

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

প্রথমত, প্রতি উদাহরণ অ্যাক্সেস নিয়ন্ত্রণের ব্যয় খুব বেশি হতে পারে। এটি অন্যদের দ্বারা এই থ্রেডে আলোচনা করা হয়েছে। তত্ত্বগতভাবে, এটি এই পয়েন্টার চেকের মাধ্যমে করা যেতে পারে । তবে এটি সংকলনের সময়ে করা যায় না এবং এটি কেবল রান টাইমে করা যায় at সুতরাং রান সময় আপনাকে প্রতিটি সদস্যের অ্যাক্সেস নিয়ন্ত্রণ সনাক্ত করতে হবে এবং এটি লঙ্ঘিত হলে সম্ভবত ব্যতিক্রমগুলিই উত্থাপিত হবে। খরচ বেশি।

দ্বিতীয়ত, প্রতি শ্রেণীর অ্যাক্সেস নিয়ন্ত্রণের নিজস্ব ব্যবহারের কেস থাকে যেমন অনুলিপি নির্মাণকারী বা অপারেটর =। উদাহরণস্বরূপ অ্যাক্সেস নিয়ন্ত্রণে এগুলি প্রয়োগ করা কঠিন।

এছাড়াও, অ্যাক্সেস নিয়ন্ত্রণটি মূলত প্রোগ্রামিং / ভাষার দৃষ্টিকোণ থেকে হয়, কীভাবে কোড / সদস্যের অ্যাক্সেসকে নিয়ন্ত্রণ করতে / নিয়ন্ত্রণ করতে হয়, ডেটা নয়।


12

এটি কিছুটা নির্বিচারে ভাষা নকশার সিদ্ধান্ত। ইন রুবি , উদাহরণস্বরূপ, privateসত্যিই ব্যক্তিগত, মানে হিসেবে "শুধুমাত্র উদাহরণ হিসেবে বলা যায় তার নিজস্ব ব্যক্তিগত ডেটাতে সদস্যদের অ্যাক্সেস করতে পারেন"। তবে এটি কিছুটা সীমাবদ্ধ।

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

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


4

কৌতুক মনে রাখা যে ডেটা হল privateথেকে ক্লাসে না উদাহরণস্বরূপ ক্লাসের। আপনার শ্রেণীর মধ্যে যে কোনও পদ্ধতি সেই শ্রেণীর কোনও উদাহরণের ব্যক্তিগত ডেটা অ্যাক্সেস করতে পারে; উদাহরণস্বরূপ ডেটা প্রাইভেট রাখার উপায় নেই যদি না আপনি অন্য পদ্ধতিগুলির ব্যক্তিগত ডেটা সদস্যদের স্পষ্টভাবে অ্যাক্সেস করার পদ্ধতিগুলি নিষিদ্ধ করেন।


1

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


-8

যে কোনও ব্যক্তির অ্যাক্সেস রয়েছে তা অন্য ব্যক্তির কাছে প্রকাশ না করা পর্যন্ত ব্যক্তিগত ডেটা ব্যক্তিগত থাকে।

এই ধারণাটি অন্যান্য পরিস্থিতিতেও প্রযোজ্য যেমন:

class cMyClass
{
public:
   // ...
   // omitted for clarity
   // ...

   void Withdraw(int iAmount)
   {
      iTheSecretVault -= iAmount;
   }

private:
   int iTheSecretVault;
};

কীভাবে কেউ টাকা তুলতে পারত? :)


4
এই উদাহরণটিতে অন্য শ্রেণীর ব্যক্তিগত ডেটা সদস্যদের অ্যাক্সেস করার জন্য একটি শ্রেণীর উদাহরণ অন্তর্ভুক্ত নয়।
আন্দ্রে কারন

@Andre, "এই ধারণা অন্যান্য অবস্থা খুব যেমন ... প্রযোজ্য,"
YeenFei

other "অন্যান্য পরিস্থিতি" সংজ্ঞা অনুসারে বিষয়বস্তু, সুতরাং আপনার উদাহরণটির কোনও প্রাসঙ্গিকতা নেই (এবং আমি নিশ্চিত নই যে এটি অন্য কোথাও তথ্যমূলক হবে)
আন্ডারস্কোর_ডে

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