আমি অনুলিপি নির্মাণকারী কেন ব্যক্তিগত ভেরিয়েবল অ্যাক্সেস করতে পারি?


88

আমি শিখেছি যে আমি কখনই ক্লাসে গেট-ফাংশন দিয়ে কোনও ব্যক্তিগত ভেরিয়েবল অ্যাক্সেস করতে পারি না। তবে কেন আমি অনুলিপি নির্মাণকারীটিতে এটি অ্যাক্সেস করতে পারি?

উদাহরণ:

Field::Field(const Field& f)
{
  pFirst = new T[f.capacity()];

  pLast = pFirst + (f.pLast - f.pFirst);
  pEnd  = pFirst + (f.pEnd - f.pFirst);
  std::copy(f.pFirst, f.pLast, pFirst);
}

আমার ঘোষণা:

private:
  T *pFirst,*pLast,*pEnd;

কারণ অনুলিপি নির্মাণকারী ডিফল্টরূপে একটি শ্রেণীর সদস্য এবং অন্য কেউ কেউ।
ডাম্বকোডার

+ 53 / -0? কে এ জন্য ভোট দিয়েছে? আর কীভাবে কপি করবেন আপনি ?!? (আসুন অ-বিকল্পগুলি বাতিল করা যাক: প্রতিটি ব্যক্তিগত সদস্যের জন্য সর্বজনীন রেফারেন্স গেটর তৈরি করুন? তাহলে তারা মোটেই ব্যক্তিগত নয় const&each প্রত্যেকের জন্য সর্বজনীন বা বাই-ভ্যালু গেটর তৈরি করুন? তারপরে তারা কেবল 'রাইট-প্রাইভেট' হবেন, এবং মূল্যবোধের জন্য অপ্রয়োজনীয় সম্পদের জন্য এবং অনুলিপিযোগ্য সদস্যদের জন্য ব্যর্থ)) আমি এই জাতীয় শূন্য প্রশ্নের এমন সাফল্যে অবাক হয়েছি, অনুলিপি তৈরির বিষয়ে জিজ্ঞাসা করার সময় এর অর্থ কী তা পুরোপুরি উপেক্ষা করছে, এবং কোনও উত্তরই এটির তদন্ত করতে মৌলিক যুক্তি ব্যবহার করে না। তারা শুকনো প্রযুক্তিগত দিকগুলি ব্যাখ্যা করে, তবে এই ঝলকানো প্রশ্নের একটি দীর্ঘতম উত্তর রয়েছে
আন্ডারস্কোর_আগস্ট

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

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

উত্তর:


33

আইএমএইচও, বিদ্যমান উত্তরগুলি এর "কেন" ব্যাখ্যা করার জন্য একটি দুর্বল কাজ করে - কোন আচরণের বৈধতা পুনরুদ্ধার করার বিষয়ে খুব বেশি মনোযোগ কেন্দ্রীভূত করে। "অ্যাক্সেস মডিফায়ারগুলি ক্লাস স্তরে কাজ করে, না অবজেক্ট স্তরে।" - হ্যাঁ কিন্তু কেন?

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

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

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

বিশেষতঃ এই ক্রিয়াকলাপগুলি এগুলি করতে ব্যক্তিগতকৃত অ্যাক্সেসের সুবিধা নিতে পারে:

  • (অনুলিপি নির্মাতারা) "আরএইচএস" (ডান হাতের দিকের) অবজেক্টের একটি প্রাইভেট সদস্যকে একটি প্রারম্ভিক তালিকায় ব্যবহার করুন, যাতে কোনও সদস্যের ভেরিয়েবল নিজেই ডিফল্ট-নির্মিত (যদি আইনী হয়ে থাকে) এর পরিবর্তে কপি-বিল্ট হয় তবে খুব বেশি বরাদ্দ (আবার, আইনী হলে)
  • রিসোর্সগুলি ভাগ করুন - ফাইল হ্যান্ডলগুলি, ভাগ করা মেমরি বিভাগগুলি, shared_ptrরেফারেন্স ডেটা ইত্যাদিতে etc.
  • জিনিসের মালিকানা নিন, যেমন auto_ptr<>নির্মাণাধীন অবজেক্টের মালিকানা "চাল"
  • ব্যক্তিগত "ক্যাশে", ক্রমাঙ্কন, বা রাষ্ট্র সদস্যদের নতুন বস্তুটি স্ক্র্যাচ থেকে পুনরায় জন্মানো না করে অনুকূলভাবে ব্যবহারযোগ্য স্থানে তৈরি করার প্রয়োজন ছিল
  • অনুলিপি / অ্যাক্সেস ডায়াগোনস্টিক / অবজেক্টে রাখা তথ্যটি অনুলিপি করা হয়েছে যা সর্বজনীন এপিআইয়ের মাধ্যমে অন্যথায় অ্যাক্সেসযোগ্য নয় তবে পরে কিছু ব্যতিক্রম বস্তু বা লগিং দ্বারা ব্যবহার করা যেতে পারে (যেমন সময় / পরিস্থিতিতে সম্পর্কে কিছু যখন "মূল" অনুলিপি-নির্মিত না নির্মাণ করা হয়)
  • কিছু তথ্যের আরও দক্ষ অনুলিপি সম্পাদন করুন: উদাহরণস্বরূপ অবজেক্টগুলিতে unordered_mapসদস্য থাকতে পারে তবে প্রকাশ্যে কেবল এক্সপোজ begin()এবং end()পুনরুদ্ধারকারী - আপনার কাছে সরাসরি অ্যাক্সেস সহ দ্রুত অনুলিপি করার ক্ষমতা size()থাকতে reserveপারে; খারাপ এখনো যদি তারা শুধুমাত্র এক্সপোজ at()এবং insert()এবং অন্যথায় throw....
  • অনুলিপি পিতামাতা / সমন্বয় / পরিচালিত অবজেক্টগুলিতে অনুলিপি করুন যা ক্লায়েন্ট কোডের জন্য অজানা বা কেবল লেখার জন্য থাকতে পারে

4
আমি মনে করি সবচেয়ে বড় 'কেন' হ'ল this == otherপ্রতিটি সময় other.xঅ্যাক্সেস মডিফায়াররা যদি অবজেক্ট স্তরে কাজ করে তবে আপনাকে যা করতে হবে তা যাচাই করে দেখার জন্য এটি একটি দুর্দান্ত রানটাইম ওভারহেড হবে।
আইয়ুব

4
@ আইয়ুব আমি মনে করি আপনার উত্তরটি উপায়, উপায় আরও বিশিষ্ট হওয়া উচিত। যদিও টনির উত্তরটি সত্যিই ভাল এবং ধারণাগত, যদি আমি একজন বাজি ধরার মানুষ হয়ে থাকি তবে আমি বাজি ধরতাম যে আপনার উত্তরটি পছন্দটির আসল reasonতিহাসিক কারণ। এটি কেবল আরও পারফরম্যান্সই নয়, এটি আরও সহজ। বর্জনে একটি দুর্দান্ত প্রশ্ন হবে!
নীড় ফ্রিডম্যান

আমি আপনার উত্তর চিহ্নিত করেছি, কারণ এটি ব্যাকগ্রাউন্ডটি ব্যাখ্যা করে;)
পরাজিত

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

@ আইউব: পুরানো মন্তব্য, তবে যাইহোক ... " this == otherপ্রতিবার আপনি অ্যাক্সেস করবেন কিনা তা পরীক্ষা করে দেখুন other.x" - পয়েন্টটি মিস করে - যদি other.xরানটাইমের সময় সমান হয়ে this.xথাকে তবে other.xপ্রথম স্থানে তেমন পয়েন্টার রাইটিং থাকবে না ; সংকলক পাশাপাশি আপনি if (this == other) ...this.x...যা করতে যাচ্ছিলেন লিখতে বাধ্য করতে পারে । আপনার "সুবিধার্থে (এমনকি যদি ব্যক্তিগত ভেরিয়েবলগুলি সর্বজনীন ছিল)" ধারণাটিও বিন্দুটি মিস করে - স্ট্যান্ডার্ডের যেভাবে সংজ্ঞায়িত করা হয়েছে তা যথাযথ এনক্যাপসুলেশনকে অনুমতি দেওয়ার জন্য যথেষ্ট পরিমাণে সীমাবদ্ধ তবে অকারণে অসুবিধে হয় না।
টনি ডেলরয়

109

অ্যাক্সেস মডিফায়ারগুলি ক্লাস স্তরে কাজ করে , না অবজেক্ট স্তরে

তা হচ্ছে, একই শ্রেণীর দুটি অবজেক্ট একে অপরকে ব্যক্তিগত ডেটা অ্যাক্সেস করতে পারে।

কেন:

মূলত দক্ষতার কারণে। অ্যাক্সেস মডিফায়াররা যদি অবজেক্ট স্তরে কাজ করে থাকে তবে this == otherপ্রতিবার আপনার অ্যাক্সেস other.xকরতে হবে কিনা তা যাচাই করা এটি একটি অ-উপেক্ষিত রানটাইম ওভারহেড হবে।

আপনি যদি এটিকে স্কোপিংয়ের দিক থেকে মনে করেন তবে এটি এক ধরণের শব্দার্থগতভাবে যৌক্তিক: "একটি ব্যক্তিগত ভেরিয়েবল সংশোধন করার সময় কোডের কত বড় অংশ আমার মনে রাখা দরকার?" - আপনার পুরো ক্লাসের কোডটি মাথায় রাখা দরকার এবং এটি অরথগোনাল যার সাথে রানটাইমের সময় অবজেক্টগুলি বিদ্যমান।

এবং অনুলিপিটিত সুবিধাজনক যখন অনুলিপি নির্মাণকারী এবং অ্যাসাইনমেন্ট অপারেটরগুলি লেখেন।



10

উত্তরটি বুঝতে, আমি আপনাকে কয়েকটি ধারণাটি স্মরণ করিয়ে দিতে চাই।

  1. আপনি কতগুলি অবজেক্ট তৈরি করেন তা বিবেচনা না করেই that শ্রেণীর জন্য মেমরিতে একটি ফাংশনের কেবল একটি অনুলিপি থাকে। এর অর্থ ফাংশনগুলি একবারই তৈরি করা হয়। তবে ভেরিয়েবলগুলি ক্লাসের প্রতিটি উদাহরণের জন্য পৃথক।
  2. this কল করার সময় পয়েন্টারটি প্রতিটি ফাংশনে প্রেরণ করা হয়।

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

আশা করি এটি আপনার প্রশ্নের উত্তর দেয়।


6

অনুলিপি কনস্ট্রাক্টর ক্লাস 'মেম্বার ফাংশন এবং যেমন শ্রেণীর ডেটা সদস্যদের অ্যাক্সেস রয়েছে এমনকি এমনকী' ব্যক্তিগত 'হিসাবে ঘোষণা করা হয়েছে।


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