2011-08-30 26 views
15

मुझे हाल ही में पता चला है कि सी ++ में संदर्भ-से-फ़ंक्शन अवधारणा है :)। इसलिए पॉइंटर-टू-फ़ंक्शन और पॉइंटर-टू-सदस्य-फ़ंक्शन विभिन्न प्रकार हैं। सवाल उठता है। क्या कोई "संदर्भ-से-सदस्य-कार्य" अवधारणा है?सदस्य समारोह के लिए संदर्भ?

मैंने निम्नलिखित कोड को संकलित करने का प्रयास किया, लेकिन जीसीसी 3.4.6 एक त्रुटि देता है।

#include <iostream> 

using namespace std; 

class A { 
public: 
    virtual void Af() const { 
    cout << "A::Af()" << endl; 
    } 
}; 

int main() { 
    typedef void (A::& MemFnc)() const; 
    MemFnc mf = &A::Af; 

    A a; 
    (a.*mf)(); 

    return 0; 
} 
+3

जीसीसी 3.4.6? आपको कंपाइलर को अपडेट करने पर विचार करना चाहिए। साथ ही, जब संकलक त्रुटियों को ट्रिगर करने वाले कोड के बारे में पूछते हैं, तो आमतौर पर वास्तविक त्रुटि संदेश (आउटपुट में पहली त्रुटि से शुरू) प्रदान करना और संकलक शिकायत करने वाली रेखा की पहचान करना एक अच्छा विचार है। –

+0

मुझे जीसीसी अपडेट करने की कोई अनुमति नहीं है :(। मैंने त्रुटि कोड प्रदान नहीं किया क्योंकि मुझे लगता है कि इस मामले में इससे कोई फर्क नहीं पड़ता कि यह किस प्रकार की त्रुटि देता है, आवश्यक हिस्सा यह है कि यह इस वाक्यविन्यास को समझ में नहीं आता है। – MKo

+0

यदि सदस्य का संदर्भ होगा, तो इसका उपयोग करने के लिए किस वाक्यविन्यास का उपयोग किया जाना चाहिए? एक सूचक-से-सदस्य का उपयोग '। *' के साथ किया जाता है, इसलिए आम उपयोग से पता चलता है कि सदस्य के संदर्भ में केवल स्टार छोड़ना चाहिए, जो बाहर निकलता है सादा होने के लिए '.' ?! जो सामान्य सदस्य का उपयोग करने जैसा बिल्कुल है। – Sjoerd

उत्तर

20

कोई ऐसी बात सदस्य करने के लिए संदर्भ C++ कहा जाता है।

एक नोट (§8.3.3/3 - 2003) में

भाषा विनिर्देश स्पष्ट रूप से कहते हैं कि,

सदस्य के लिए एक सूचक एक वर्ग (9.4) के एक स्थिर सदस्य को इंगित नहीं करेगा, संदर्भ प्रकार वाला एक सदस्य, या "सीवी शून्य"। [नोट: 5.3 और 5.5 भी देखें। "सूचक के लिए सूचक" प्रकार "पॉइंटर" प्रकार से अलग है, यानी, सदस्य के लिए सूचक केवल सूचक घोषितकर्ता वाक्यविन्यास के लिए सूचक द्वारा घोषित किया जाता है, और कभी भी सूचक घोषणाकर्ता द्वारा नहीं किया जाता है। सी ++ में कोई "संदर्भ-से-सदस्य" प्रकार नहीं है।

+2

तकनीकी रूप से, ** ** बोल्ड ** में आपको जो हाइलाइट किया गया है वह गैर-मानक है क्योंकि यह केवल एक नोट है। –

+0

@ चार्ल्स: हाँ। मुझे पता है। लेकिन इसे पढ़ने और समझना आसान है। यही कारण है कि मैंने इसे उद्धृत किया। – Nawaz

+5

मेरा मुद्दा यह है कि जब आप कहते हैं कि "भाषा विनिर्देश स्पष्ट रूप से कहता है", यह थोड़ा अपमानजनक है क्योंकि विनिर्देश स्पष्ट रूप से ' कोई नहीं है "संदर्भ ence-to-member "type ', यह सिर्फ एक प्रदान करने के लिए छोड़ देता है। –

1

सदस्य समारोह के लिए कोई संदर्भ नहीं है।

1

नहीं, सदस्य कार्यों के संदर्भ संभव नहीं हैं।

कुछ अर्थ में, एक सदस्य कार्य करने के लिए एक सूचक dereferencing का परिणाम एक के रूप में सेवा कर सकता है, लेकिन केवल बात आपको लगता है कि परिणाम के साथ क्या कर सकते हैं इस पर एक समारोह कॉल ऑपरेटर आह्वान करने के लिए, 5.5[expr.mptr.oper]/6 प्रति है। और कुछ भी अनुमति नहीं है।

संबंधित मुद्दे