আমার সদস্য ডেটাতে পয়েন্টার বা রেফারেন্স পছন্দ করা উচিত?


138

প্রশ্নটি বর্ণনা করার জন্য এটি একটি সরল উদাহরণ:

class A {};

class B
{
    B(A& a) : a(a) {}
    A& a;
};

class C
{
    C() : b(a) {} 
    A a;
    B b; 
};

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

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

আমি সাধারণত সদস্য ডেটাতে কেবলমাত্র পয়েন্টার ব্যবহার করব যখন পয়েন্টারটি শূন্য হতে পারে বা পরিবর্তন করতে পারে। ডেটা সদস্যদের জন্য রেফারেন্সের তুলনায় পয়েন্টারগুলি পছন্দ করার অন্য কোনও কারণ আছে কি?

রেফারেন্স যুক্ত কোনও বস্তু কার্যনির্বাহী হওয়া উচিত নয়, যেহেতু একবার সূচনা করার পরে কোনও রেফারেন্স পরিবর্তন করা উচিত নয়?


"তবে ডিফল্ট অনুলিপি এবং অ্যাসাইনমেন্টটি পয়েন্টারগুলির সাথেও খারাপ": এটি একই নয়: পয়েন্টারটি যখনই চান কনস্ট্রেন্ট না হলে পরিবর্তন করা যেতে পারে। একটি রেফারেন্স সাধারণত সর্বদা কনস্ট! এমনকি "const" KEYWORD ছাড়া অন্তত জিসিসি এ কম্পাইলার () আপনাকে সতর্ক করবে রেফারেন্স const যাহাই হউক না কেন হয়; (আপনি যদি আপনার সদস্য পরিবর্তন করার চেষ্টা করুন এই দেখতে হবে "এ & একটি
mmmmmmmm

এর সাথে মুখ্য সমস্যাটি হ'ল যদি কেউ বি বি (এ ()) করে তবে আপনি বিচলিত হবেন কারণ আপনি ঝুঁকছেন এমন রেফারেন্স দিয়ে শেষ করছেন।
লগ 0

উত্তর:


67

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

সমস্যাগুলির উদাহরণ:

  • আপনি প্রতিটি নির্মাণকারীর প্রাথমিক সূচকে রেফারেন্সটি শুরু করতে বাধ্য হচ্ছেন: এই সূচনাটি অন্য ফাংশনে ফ্যাক্ট করার কোনও উপায় নেই ( সি ++ 0 এক্স অবধি, সম্পাদনা করুন: সি ++ এর এখন নির্ধারক কনস্ট্রাক্টর রয়েছে )
  • রেফারেন্সটি প্রত্যাহারযোগ্য বা নਾਲ হতে পারে না। এটি একটি সুবিধা হতে পারে, তবে কোডটি রিব্যান্ডিং বা সদস্যটিকে শূন্য করার জন্য যদি কখনও পরিবর্তন প্রয়োজন হয় তবে সদস্যের সমস্ত ব্যবহার পরিবর্তন করা দরকার
  • পয়েন্টার সদস্যদের বিপরীতে, রিফ্যাক্টরিংয়ের প্রয়োজন হতে পারে বলে সহজেই রেফারেন্সগুলি স্মার্ট পয়েন্টার বা পুনরুক্তি দ্বারা প্রতিস্থাপন করা যায় না
  • যখনই কোনও রেফারেন্স ব্যবহৃত হয় তখন এটি মান ধরণের ( .অপারেটর ইত্যাদি) মতো লাগে তবে পয়েন্টারের মতো আচরণ করে (ঝুঁকতে পারে) - সুতরাং যেমন গুগল স্টাইল গাইড এটিকে নিরুৎসাহিত করে

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

4
@ মাইকোলা: আমি আপনার সাথে একমত আমি প্রাথমিক সদস্যদের তালিকায় সদস্যদের ইনিশিয়াল করা পছন্দ করি, আমি নাল পয়েন্টারগুলি এড়িয়ে চলি এবং ভেরিয়েবলের অর্থ পরিবর্তন করা অবশ্যই এটি ভাল নয়। যেখানে আমাদের মতামত পৃথক হয় তা হ'ল আমার প্রয়োজন হয় না বা সংকলকটি আমার জন্য এটি প্রয়োগ করতে চায়। এটি ক্লাসকে লেখার পক্ষে সহজ করে তোলে না, আমি এই অঞ্চলে যে বাগগুলি ধরতে পারি তা আসেনি, এবং মাঝে মাঝে আমি কোড থেকে যে নমনীয়তার সাথে ধারাবাহিকভাবে পয়েন্টার সদস্যদের ব্যবহার করি (স্মার্ট পয়েন্টার যেখানে উপযুক্ত) তা প্রশংসা করি appreciate
জেমস হপকিন

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

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

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

156

থাম্বের নিজস্ব নিয়ম:

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

1
আমি মনে করি আপনার এবং মাইকোলার সঠিক উত্তর এবং পয়েন্টারলেস (কম পয়েন্টার পড়ুন) প্রোগ্রামিং প্রচার করুন।
অমিত

37

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

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

এবং সম্ভবত এক বা শূন্য সম্পর্কটিকে পয়েন্টার হিসাবে বর্ণনা করা ঠিক আছে।

সুতরাং কোনও 'আমরা বরাদ্দ করতে পারি না' তারপরে ফ্যাক্টর।
প্রচুর প্রোগ্রামার কেবল পয়েন্টারগুলির সাথে ব্যবহার করে এবং সে কারণেই তারা রেফারেন্সের ব্যবহার এড়াতে কোনও যুক্তি খুঁজে পাবে।

সদস্য হিসাবে পয়েন্টার থাকা আপনাকে বা আপনার দলের সদস্যকে "ঠিক কিছু ক্ষেত্রে" মন্তব্যে ব্যবহারের আগে বারবার পয়েন্টারটি পরীক্ষা করতে বাধ্য করবে। যদি কোনও পয়েন্টার শূন্য হতে পারে তবে পয়েন্টারটি সম্ভবত ধরণের পতাকা হিসাবে ব্যবহৃত হয়, যা খারাপ, কারণ প্রতিটি বস্তুর নিজস্ব ভূমিকা পালন করতে হয়।


2
+1: আমিও একই অভিজ্ঞতা পেয়েছি। কেবলমাত্র কিছু জেনেরিক ডেটা স্টোরেজ ক্লাসগুলিতে অ্যাসিগনেম্টন এবং অনুলিপি-ক্যাটার প্রয়োজন। এবং আরও উচ্চ-স্তরের ব্যবসায়িক অবজেক্ট ফ্রেমওয়ার্কগুলির জন্য অনুলিপি করার জন্য অন্যান্য কৌশল থাকতে হবে যা "অনন্য ক্ষেত্রগুলি অনুলিপি করবেন না" এবং "অন্য পিতামাতার সাথে যুক্ত করুন" ইত্যাদির মতো জিনিসগুলিও পরিচালনা করতে পারে তাই আপনি আপনার ব্যবসায়ের বিষয়গুলি অনুলিপি করার জন্য উচ্চ-স্তরের কাঠামো ব্যবহার করেন এবং নিম্ন-স্তরের কার্যভারগুলি বাতিল করুন।
মিমি মিমি মিমি

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

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

11

7
আমি এটি পড়েছি কিন্তু আমি অনুভব করেছি যে এটি পরামিতিগুলি পাস করার কথা বলছে, সদস্যের ডেটা নয়। "রেফারেন্সগুলি সাধারণত কোনও সামগ্রীর ত্বকে প্রদর্শিত হয় এবং অভ্যন্তরের দিকে নির্দেশ করে।"
markh44

হ্যাঁ, আমি মনে করি না এটি সদস্য উল্লেখের প্রসঙ্গে ভাল পরামর্শ।
টিম অ্যাঙ্গাস

6

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

এই ধরনের ক্ষেত্রে, অ্যাসাইনমেন্ট অপারেটরটি (এবং প্রায়শই অনুলিপি নির্মাণকারীও) অ-ব্যবহারযোগ্য ( boost::noncopyableতাদের কাছ থেকে উত্তরাধিকারসূত্রে বা ব্যক্তিগত হিসাবে ঘোষণা করে) তৈরি করার বিষয়টি নিশ্চিত করুন।

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


6

সবাই যেমন সাধারণ নিয়ম জারি করছে বলে মনে হচ্ছে, আমি দুটি প্রস্তাব করব:

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

  • মৌলিক ধরণের ব্যতীত ফাংশনগুলিতে প্যারামিটারগুলি পাস করার সময়, বা অ্যালগরিদমের কোনও অনুলিপি প্রয়োজন হলে সর্বদা, সর্বদা, উল্লেখগুলি ব্যবহার করুন।

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


2
প্রথমটির সাথে পুরোপুরি একমত হবেন না, তবে মতানৈক্যকে মূল্যের পক্ষে মূল্য দেওয়ার কোনও বিষয় নয়। +1
ডেভিড রদ্রিগেজ - ড্রিবিয়াস

(এসও এর ভাল ভোটারদের সাথে আমরা এই যুক্তিটি হারাতে
দেখছি

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

1
নীল> আমি সম্মত তবে এটি "মতামত" নয় যা আমাকে ভোট দিয়েছিল, এটি "কখনই নয়"। এখানে বিতর্ক হিসাবে কোনওভাবেই সহায়ক বলে মনে হচ্ছে না আমি আমার ডাউন ভোট বাতিল করব।
ক্লাইম

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

4

হ্যাঁ: এটি কি সত্য বলা যায় যে কোনও রেফারেন্স যুক্ত কোনও বস্তু কার্যনির্বাহী হওয়া উচিত নয়, যেহেতু একবার রেফারেন্স শুরু করার পরে পরিবর্তন করা উচিত নয়?

ডেটা সদস্যদের জন্য আমার নিয়মের নিয়ম:

  • কোনও রেফারেন্স ব্যবহার করবেন না, কারণ এটি অ্যাসাইনমেন্ট বাধা দেয়
  • যদি আপনার শ্রেণি মুছে ফেলার জন্য দায়বদ্ধ থাকে তবে বুস্টের স্কোপড_পিটার ব্যবহার করুন (যা একটি অটো_পিটারের চেয়ে নিরাপদ)
  • অন্যথায়, একটি পয়েন্টার বা কনস্ট পয়েন্টার ব্যবহার করুন

2
এমনকি ব্যবসায়ের কোনও অ্যাসাইনমেন্টের প্রয়োজন হলে আমি কোনও মামলার নামও দিতে পারি না।
মাইকোলা গোলুয়েভ

1
+1: আমি কেবল অটো_পিটার সদস্যদের সাথে সাবধান হওয়ার জন্য যুক্ত করতাম - তাদের যে কোনও শ্রেণীর অবশ্যই অ্যাসাইনমেন্ট এবং অনুলিপি নির্মাণের স্পষ্টরূপে সংজ্ঞায়িত করা উচিত (উত্পন্ন ব্যক্তিরা যা প্রয়োজন তা খুব সম্ভবত সম্ভাব্য নয়)
জেমস হপকিন

অটো_পিটারও (বুদ্ধিমান) অ্যাসাইনমেন্টটি বাধা দেয়।

2
@ মাইকোলা: আমি এই অভিজ্ঞতাটিও তৈরি করেছিলাম যে আমার 98% ব্যবসায়ের জন্য অ্যাসাইনমেন্ট বা অনুলিপি-সি'টার দরকার নেই। আমি এটিকে একটি ছোট ম্যাক্রো দ্বারা আটকাচ্ছি যা আমি সেই ক্লাসগুলির শিরোনামগুলিতে যুক্ত করি যা কপি সি'আর এবং অপারেটরকে = () কোনও প্রয়োগ না করেই ব্যক্তিগত করে তোলে। সুতরাং 98% অবজেক্টে আমি রেফারেন্সও ব্যবহার করি এবং এটি নিরাপদ।
মিমি মিমি মিমি

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

2

আমি সাধারণত সদস্য ডেটাতে কেবলমাত্র পয়েন্টার ব্যবহার করব যখন পয়েন্টারটি শূন্য হতে পারে বা পরিবর্তন করতে পারে। ডেটা সদস্যদের জন্য রেফারেন্সের তুলনায় পয়েন্টারগুলি পছন্দ করার অন্য কোনও কারণ আছে কি?

হ্যাঁ. আপনার কোডের পাঠযোগ্যতা। একটি পয়েন্টার এটি আরও স্পষ্ট করে তোলে যে সদস্যটি একটি রেফারেন্স (হাস্যকরভাবে :)) এবং কোনও অন্তর্ভুক্ত বস্তু নয়, কারণ আপনি যখন এটি ব্যবহার করেন তখন আপনাকে এটি ডি-রেফারেন্স করতে হয়। আমি জানি কিছু লোক এটি পুরানো ফ্যাশন মনে করেন তবে আমি এখনও মনে করি এটি কেবল বিভ্রান্তি এবং ভুলগুলি রোধ করে।


1
"বড়-স্কেল সি ++ সফ্টওয়্যার ডিজাইন" এ লাকোস এর পক্ষে যুক্তিও দেখায়।
জোহান কোটলিনস্কি

আমি বিশ্বাস করি কোড কমপ্লিট এটিকেও সমর্থন করে এবং আমি এর বিপক্ষে নই। যদিও এটি অত্যধিক জোরালো নয় ...
markh44

2

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


0

আমি যদি প্রশ্নটি সঠিকভাবে বুঝতে পারি ...

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

রেফারেন্স এ সদস্য ভেরিয়েবল: ডেটা বৈধতার ক্ষেত্রে উপরে হিসাবে। এটি ডেটারে নির্দেশিত গ্যারান্টি দেয়, তারপরে রেফারেন্স করা বৈধ is

কোডের পূর্বের বিন্দুতে পরিবর্তনশীল বৈধতার দায়বদ্ধতা কেবল পরবর্তী কোডগুলি সাফ করে না (আপনার উদাহরণের ক্লাস এ) কেবল নয়, তবে এটি ব্যবহারকারীর কাছে এটি স্পষ্ট করে তোলে।

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

এবং সেক্ষেত্রে (যা আপনার কোডের প্রসঙ্গে কোনও সংকুচিত হুড হিসাবে কম), অন্য একটি বিকল্প, কোনও রেফারেন্সযুক্ত, নন পয়েন্টার একটি পরামিতি ব্যবহার করার জন্য, এটিকে অনুলিপি করবে এবং উপমাটিকে অকেজো করে দেবে - I সত্যিই ভাববেন না যে আপনি এটি বিকল্প হিসাবে বোঝাচ্ছেন।

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

পয়েন্টারগুলি দরকারী যদি বি এর একটি প্যারামিটার সেট করার গ্যারান্টি না দেওয়া হয়, বা পুনরায় নিয়োগ দেওয়া যেতে পারে। এবং কখনও কখনও একটি দুর্বল পয়েন্টার বাস্তবায়নের জন্য খুব ভার্জোজ হয়, এবং একটি ভাল সংখ্যক লোক হয় দুর্বল_পিটার কী তা জানেন না, বা কেবল তাদের অপছন্দ করেন।

এই উত্তরটি ছিন্ন করুন, দয়া করে :)

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