ওভারলোডিং সদস্য অ্যাক্সেস অপারেটরগুলি ->, *।


129

আমি সদস্য এক্সেস অপারেটরদের বাদে, সবচেয়ে অপারেটর ওভারলোডিং বুঝতে ->, .*,->* ইত্যাদি

বিশেষত, এই অপারেটর ফাংশনগুলিতে কী পাস হয় এবং কী ফিরিয়ে দেওয়া উচিত?

অপারেটর কীভাবে কাজ করবে (উদাহরণস্বরূপ operator->(...)) কী সদস্যকে রেফার করা হচ্ছে? এটা কি জানতে পারে? এটি এমনকি জানা প্রয়োজন?

সবশেষে, এমন কোনও প্রতিবন্ধক বিবেচনা আছে যা বিবেচনায় নেওয়া দরকার? উদাহরণস্বরূপ, operator[]কোনও কিছু ওভারলোড করার সময় , সাধারণত আপনার কনস্ট এবং নন-কনস্ট উভয় সংস্করণ প্রয়োজন need সদস্য অ্যাক্সেস অপারেটরদের কি কনস্ট এবং নন-কনস্ট্যান্ট সংস্করণগুলি প্রয়োজন?


1
আমি উপরের সি ++ তে বিশ্বাস করি - উপরের প্রশ্নে জিজ্ঞাসিত সকল প্রশ্নাবলীর উপর ফ্যাক্স স্পর্শ করে
অলোক সেভ

constএবং অ- constসংস্করণগুলির প্রয়োজনoperator-> হয় না , তবে উভয় সরবরাহ করা কার্যকর হতে পারে।
ফ্রেড ফু


9
@Als: দ্য প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী কীভাবে জমিদার করতে ->*এবং .*। আসলে এটি তাদের উল্লেখও করে না! আমি মনে করি এফএকিউতে থাকতে এগুলি বিরল, তবে আমি এ প্রশ্নটি খুব খুশিভাবে লিঙ্ক করেছি। এফএকিউ এর দ্বিপ হিসাবে এটি বন্ধ করবেন না দয়া করে!
sbi

@ এসবিআই, আমি আপনার (ভয়ঙ্কর) এফএকিউ থেকে এই প্রশ্নের একটি লিঙ্ক সন্ধান করতে পুরোপুরি ব্যর্থ হয়েছি এবং একটি সদৃশ প্রশ্ন জিজ্ঞাসা করে শেষ করেছি। আপনি এটি আরও সুস্পষ্ট করতে পারেন? (এটি ইতিমধ্যে সুস্পষ্ট থাকলে ক্ষমা চাই)
পি i

উত্তর:


144

->

এটিই সত্যই কৌশলযুক্ত। এটি অবশ্যই একটি ননস্ট্যাটিক সদস্য ফাংশন হতে পারে এবং এটি কোনও যুক্তি গ্রহণ করে না। রিটার্ন মানটি সদস্য অনুসন্ধান করতে ব্যবহৃত হয়।

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

struct client
    { int a; };

struct proxy {
    client *target;
    client *operator->() const
        { return target; }
};

struct proxy2 {
    proxy *target;
    proxy &operator->() const
        { return * target; }
};

void f() {
    client x = { 3 };
    proxy y = { & x };
    proxy2 z = { & y };

    std::cout << x.a << y->a << z->a; // print "333"
}

->*

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

অন্য কথায়, এই এক ঠিক একটি স্বাভাবিক বাইনারি অপারেটর +, -এবং /। আরও দেখুন: ফ্রি অপারেটর -> * ওভারলোডগুলি কি মন্দ?

.* এবং .

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

ওভারলোডিং ->, ->*, ., এবং .*শুধুমাত্র ক্ষেত্রে পূরণ করতে পারেন যেখানে একটি অভিব্যক্তি undefined হবে, এটি একটি অভিব্যক্তি কোনো ওভারলোডিং সঙ্গে বৈধ হবে অর্থ পরিবর্তন করতে পারেন।


2
আপনার শেষ বক্তব্য সম্পূর্ণ সত্য নয়। উদাহরণস্বরূপ, আপনি newঅপারেটরটিকে ওভারলোড করতে পারেন , যদিও এটি ওভারলোড না হয়েও বৈধ।
ম্যাট

6
@ ম্যাট ভাল, newসর্বদা অতিরিক্ত লোড করা হয়, বা ওভারলোডিংয়ের নিয়মগুলি এটিতে সত্যিই প্রযোজ্য না (১৩.৫ / ৫: বরাদ্দ এবং অবলম্বন ফাংশন, অপারেটর নতুন, অপারেটর নতুন [], অপারেটর মোছা এবং অপারেটর মোছা]] ৩.7 এ সম্পূর্ণ বর্ণিত হয়েছে .4। বৈশিষ্ট্যাবলী এবং সীমাবদ্ধতা এই উপপ্রকরণ বাকি পাওয়া তাদের ক্ষেত্রে প্রযোজ্য না যদি না স্পষ্টভাবে 3.7.4 বিবৃত।) কিন্তু ইউনারী ওভারলোডিং &বা বাইনারি &&, ||, অথবা ,, বা overloads যোগ operator=, অথবা একটি unscoped জন্য কিছু সম্পর্কে শুধু ওভারলোডিং গণনার প্রকার, একটি অভিব্যক্তির অর্থ পরিবর্তন করতে পারে। বিবৃতি স্পষ্ট করে জানিয়েছে, ধন্যবাদ!
পোটোসওয়টার

41

অপারেটর -> বিশেষ।

"এটির অতিরিক্ত, অ্যাটিকালিকাল সীমাবদ্ধতা রয়েছে: এটি অবশ্যই একটি অবজেক্ট (বা কোনও অবজেক্টের রেফারেন্স) ফিরিয়ে আনতে হবে যাতে পয়েন্টার ডেরিফারেন্স অপারেটরও রয়েছে, অথবা এটি অবশ্যই একটি পয়েন্টার ফেরত দিতে হবে যা পয়েন্টার ডিरेফারেন্স অপারেটর তীরটি কী নির্দেশ করছে তা বাছাই করতে ব্যবহার করতে পারেন। " ব্রুস এক্কেল: ভাবা সিপিপি ভল-ওয়ান: অপারেটর->

অতিরিক্ত কার্যকারিতা সুবিধার জন্য সরবরাহ করা হয়, তাই আপনাকে কল করতে হবে না

a->->func();

আপনি সহজভাবে করতে পারেন:

a->func();

এটি অপারেটরকে -> অন্যান্য অপারেটরের ওভারলোড থেকে আলাদা করে তোলে।


3
এই উত্তরটি আরও creditণের দাবিদার, আপনি সেই লিঙ্কটি থেকে একেলের বই ডাউনলোড করতে পারেন এবং তথ্যটি খণ্ডের প্রথম অধ্যায় 12 এ রয়েছে।
পি i

26

আপনি সদস্য অ্যাক্সেসকে ওভারলোড করতে পারবেন না .(যেমন কি ->করে তার দ্বিতীয় অংশ )। তবে আপনি অ্যানারি ডেরিফারেন্সিং অপারেটরটিকে ওভারলোড করতে পারেন *(অর্থাত্ প্রথমটি কী ->করে)।

সি ++ ->অপারেটরটি মূলত দুটি ধাপের মিলন এবং যদি আপনি x->yএটির সমতুল্য মনে করেন তবে এটি স্পষ্ট (*x).y। সি ++ আপনাকে (*x)যখন xআপনার শ্রেণীর উদাহরণ হিসাবে অংশটির সাথে কী করতে হবে তা কাস্টমাইজ করতে দেয় ।

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


2
দুর্দান্ত ব্যাখ্যা! আমি অনুমান করি যে ->*এটির জন্য একই , কারণ এটি আকারের সমতুল্য (*x).*?
বিংগো

10

দ্য ->অপারেটর জানে না কী সদস্য তীক্ষ্ন হচ্ছে, এটা ঠিক প্রকৃত সদস্য এক্সেস সম্পাদন করতে একটি বস্তু প্রদান করে।

অতিরিক্তভাবে, আমি কেন কনস্ট্যান্ড এবং নন-কনস্ট্যান্ট সংস্করণগুলি সরবরাহ করতে পারছি না তার কোনও কারণ আমি দেখতে পাচ্ছি।


7

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

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

স্থিরতা হিসাবে - এটি মন্তব্য এবং অন্যান্য উত্তরে উত্তর দেওয়া হয়েছে (আপনি উভয় সরবরাহ করতে পারেন, এবং করা উচিত)।

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