2012-11-10 45 views
10

मैं अगर वहाँ एक C++ वर्ग समारोह के अन्य नाम के लिखने के लिए एक आसान तरीका था सोच रहा था। उदाहरण के लिए, अगर मैं कुछ list कंटेनर वस्तु है, एक तार्किक समारोहC++ वर्ग समारोह उपनाम

int list::length() { return len; } 

होगा लेकिन एक तार्किक उर्फ ​​कि प्रोग्रामर का उपयोग कर सकते

int list::size() { return len; } 

हो सकता है तो, बजाय अपनी पूरी के साथ दोनों कार्यों लिखने की शरीर, वहाँ list::size()list::length() ऐसी है कि वह एक नकली जब संकलित नहीं है के उपनाम के बनाने के लिए किसी भी तरह से है, बल्कि एक ही समारोह का संदर्भ?

मैंने पढ़ा है कि आप इसे #define के साथ कर सकते हैं, लेकिन मैं अन्य कोड-नामों के साथ कहीं भी पूरी तरह से दायरे से बाहर भ्रम नहीं करना चाहता (यानी 'आकार' चर)।
मैंने यह भी कहा कि समारोह संकेत, इसे ठीक कर सकते हैं, लेकिन यह है कि वास्तव में एक उपनाम नहीं है (क्योंकि यह de-संदर्भित लागू करने के लिए है), और न ही कार्य कर सकते हैं संकेत दिए गए एक घोषणा दी जानी इसे करने के लिए एक भ्रामक हेल्प-लाइन दे रही है पढ़ उपयोगकर्ता (मुझे लगता है), साथ ही भ्रम अगर मुझे किसी अन्य ऑब्जेक्ट के अंदर अपना कोड घोंसला करने की ज़रूरत है (मुझे दायरे को समायोजित करना होगा)।

inline int list::length() { return len; } 
    inline int list::size() { return length(); } 

या, ग के लिए किसी भी सख्त 'उर्फ' वाक्य रचना ++ है:

मेरे अनुमान से एक, निम्नलिखित सबसे अनुकूलन compilers द्वारा एक सीधा समारोह उपनाम के रूप में ले जाया जाएगा है? (मुझे कोई नहीं मिला - यकीन नहीं था)
तो फिर, ऐसा करने का सबसे प्रभावी तरीका क्या होगा?

संपादित करें: मैंने केवल प्रश्न को लपेटने के लिए उत्तर स्वीकार कर लिया है, क्योंकि यह केवल मेरी जिज्ञासा है। अच्छी जानकारी वाला कोई भी व्यक्ति, कृपया टिप्पणी या उत्तर जोड़ें, और मैं अपना जवाब भी बदल सकता हूं।

+0

एलियासिंग आमतौर पर संदर्भ है, जो संकेत की तरह काम करते हैं और अपसंदर्भन के लिए की जरूरत को जोड़ने के द्वारा किया जाता है। – imreal

+1

यदि आपका सही कोड है तो आपके अंतिम कोड को किसी भी आधुनिक कंपाइलर द्वारा दोनों कार्यों के लिए एक ही असेंबली का उत्पादन करना चाहिए। – chris

+0

अच्छा सवाल। मुझे लगता है कि इसे डिफ़ॉल्ट और हटाए गए कार्यों की अनुमति देकर 'सी ++ 11' में लिया गया था। यदि 'int foo() = delete' ठीक है, तो क्यों नहीं लिखा है कि int intoo() = int foo_default() 'ठीक से ठीक क्यों नहीं हो सकता है? शायद अगले मानक में :) जहां तक ​​मुझे पता है कि वर्तमान में शरीर में अन्य func का संदर्भ देने से बेहतर तरीका नहीं है। – SomeWittyUsername

उत्तर

4

मैं यह करने के पूर्वप्रक्रमक और #define का उपयोग नहीं होता। सामान्य प्रीप्रोसेसर में सी ++ में अंतिम उपाय होना चाहिए। यह C++ FAQ on inline functions देखें जिसमें प्रीप्रोसेसर के मैक्रोज़ का उपयोग करने की विभिन्न बुराइयों पर एक अनुभाग भी शामिल है।

दृष्टिकोण मैं का उपयोग किया जाएगा होगा एक समारोह एक और अधिक जटिल समारोह और इंटरफेस के साथ कई अलग अलग उपनाम होगा कि है करने के लिए आप निम्नलिखित की तरह कुछ करना होगा:

int list::length(string xString, int iValue) { 
    int iReturnValue = 0; // init the return value 
    // do stuff with xString and iValue and other things 
    return iReturnValue; 
} 

तब के लिए निम्नलिखित की तरह कुछ करना एक उपनाम

inline int list::size(string xString, int iValue) {return length(xString, iValue);} 

इनलाइन मूल रूप से वास्तविक फ़ंक्शन कॉल के साथ उपनाम को प्रतिस्थापित करना चाहिए।

भी इस stack overflow posting Giving a function implementation more than one name देखें। यह कुछ कारण प्रदान करता है कि आप ऐसा क्यों नहीं करना चाहते हैं। सी ++ में

+0

तो, मुझे लगता है कि इसके बारे में मेरा प्रश्न होगा, इनलाइन फ़ंक्शंस अभी भी तर्कों को ढेर कर देगा; क्या यह एक डबल-स्टैक लागू करेगा? यानी 'सूची :: आकार' फ़ंक्शन के लिए स्टैक पैरामीटर और फिर आंतरिक 'सूची :: लंबाई' फ़ंक्शन कॉल के लिए पैरा के _another_ सेट को ढेर करें, क्योंकि संकलक 'सूची :: आकार' तर्कों को फिर से उपयोग करने की अपेक्षा कर सकता है उन्हें फिर से भेजने के अलावा? या संकलक इसे पकड़ते हैं और केवल एक ढेर लागू करते हैं? मुझे पता है कि यह वास्तव में आधुनिक प्रणालियों पर अनुकूलन का अधिक नहीं है, लेकिन मैं सिर्फ उत्सुक था .. – Codesmith

+0

@AUTO, यहां इनलाइन फ़ंक्शंस (http://www.parashift.com/c++-faq/inline- कार्यक्षमताओं पर एक FAQ है। एचटीएमएल)। इनलाइन फ़ंक्शन का विचार यह है कि कंपाइलर फ़ंक्शन पर कॉल नहीं करता है बल्कि यह फ़ंक्शन का स्रोत टेक्स्ट लेता है और फ़ंक्शन के जेनरेट ऑब्जेक्ट कोड के साथ फ़ंक्शन कॉल को प्रतिस्थापित करता है। यही कारण है कि यह कोड ब्लोट का कारण बन सकता है। –