तीर ऑपरेटर कोई आदानों है। तकनीकी रूप से, यह जो कुछ भी आप चाहते हैं उसे वापस कर सकते हैं, लेकिन इसे कुछ ऐसा वापस करना चाहिए जो या तो सूचक है या एक सूचक through chained ->
operators बन सकता है।
->
ऑपरेटर स्वचालित रूप से निर्मित संकेतक भिन्नता, नहीं operator*
का उपयोग कर अपने तर्क कॉल करने से पहले अपनी वापसी मान dereferences ताकि आप निम्नलिखित वर्ग हो सकता है:
class PointerToString
{
string a;
public:
class PtPtS
{
public:
PtPtS(PointerToString &s) : r(s) {}
string* operator->()
{
std::cout << "indirect arrow";
return &*r;
}
private:
PointerToString &r;
};
PointerToString(const string &s) : a(s) {}
PtPts operator->() const
{
std::cout << "arrow dereference\n";
return *this;
}
string &operator*() const
{
std::cout << "dereference\n";
return a;
}
};
इसे पसंद का प्रयोग करें:
PointerToString ptr(string("hello"));
string::size_type size = ptr->size();
जिसमें संकलक द्वारा परिवर्तित किया जाता है:
string::size_type size = (*ptr.operator->().operator->()).size();
(साथ के रूप में कई .operator->()
के रूप में एक वास्तविक सूचक वापस जाने के लिए आवश्यक) और आउटपुट
arrow dereference
indirect dereference
dereference
ध्यान दें, तथापि, आप निम्न कर सकते हैं कि होना चाहिए:
PointerToString::PtPtS ptr2 = ptr.operator->();
Stroupstrup से:
ऑब्जेक्ट का परिवर्तन पी सूचक में p.operator->()
सदस्य एम पर निर्भर नहीं है। यही वह अर्थ है जिसमें operator->()
एक यूनरी पोस्टफिक्स ऑपरेटर है। हालांकि, कोई नया वाक्यविन्यास पेश नहीं किया गया है, इसलिए ->
स्रोत
2011-02-08 01:30:41
कोई इनपुट नहीं होने के बाद भी सदस्य का नाम आवश्यक है। वापसी प्रकार एक सूचक होना चाहिए। इसका आमतौर पर "स्मार्ट" पॉइंटर्स बनाने के लिए उपयोग किया जाता है, इसलिए यह लपेटा हुआ ऑब्जेक्ट में पॉइंटर देता है। – Tim