2012-01-12 10 views
8

अगर मैं निम्नलिखित कोड है:क्या मैं किसी संदर्भ की संग्रहण लागत के बिना चर को उपनाम कर सकता हूं?

struct someStruct 
{ 
    int x; 
    int y; 
} 

class someClass 
{ 
    public: 
    someStruct m_member; 

    alias  m_x = m_member.x; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this 
    alias  m_y = m_member.y; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this 
} 

मैं एक संदर्भ (जो एक सूचक के रूप में एक ही है) की अतिरिक्त भंडारण लागत किये बिना m_member.x और m_member.y के उपनाम दे सकते हैं? टाइपिफ़ के समान कुछ?

+1

नोड। इस तरह का 'उपनाम' कीवर्ड निश्चित रूप से मूल्यवान होगा जब आप मौजूदा कोड को तोड़ने के बिना पुराने नाम को बहिष्कृत करना चाहते हैं या पारदर्शी रूप से किसी अन्य डेटा संरचना को लिखना चाहते हैं। डी सुखद रूप से "उपनाम" कीवर्ड है, और सी ++ में "उपयोग" है, लेकिन यह दुख की बात है कि केवल फ़ील्ड नामों के बजाय प्रकार के नामों के लिए काम करता है। मुझे आशा है कि सी ++ किसी दिन डी की क्षमता को अपनाएगा (लेकिन यह संभवतः "उपनाम" के बजाय "उपयोग" कीवर्ड के माध्यम से होगा। –

उत्तर

10

के लिए आप लिख सकते हैं इनलाइन पहुँच कार्य:

class someClass 
{ 
public: 
    someStruct m_member; 
    int& mx() { return m_member.x; } 
    int& my() { return m_member.y; } 
    int const& mx() const { return m_member.x; } 
    int const& my() const { return m_member.y; } 
}; 

तो फिर तुम इस प्रकार सदस्यों पहुँच सकते हैं:

someClass foo; 
foo.mx() = 3; 
foo.my() = 2*foo.mx(); 

यह बिल्कुल ही नहीं है वाक्यविन्यास, लेकिन करीब, और एक उचित अच्छा संकलक सह होगा इनलाइन कार्यों को पूरी तरह अनुकूलित करें।

+1

+1 शायद कम से कम बुराइयों का ... –

+0

यह एक अच्छा समझौता (+1) है, मुझे लगता है कि मैं इसके साथ रह सकता हूं। – Samaursa

+2

+1, लेकिन 'const' संस्करण भी होना चाहिए। –

1

इस परिदृश्य में मैं केवल एक संदर्भ का उपयोग करता हूं क्योंकि यह वही है जो वे उपयुक्त हैं। यदि संदर्भ ओवरहेड वास्तव में बहुत अधिक है तो मैं केवल उपनाम को छोड़ दूंगा और पूर्ण अभिव्यक्ति का उपयोग करूंगा।

लेकिन अगर आप एक मैक्रो के साथ इस लक्ष्य को हासिल कर सकता है (पढ़ें: बुराई)

class someClass 
{ 
    public: 
    someStruct m_member; 
#define m_x m_member.x 
#define m_y m_member.y 

    ... 

#undef m_x 
#undef m_y 
}; 

मैं अत्यधिक की सिफारिश करेंगे नहीं हालांकि यह कर। सभी मैक्रोज़ की तरह हालांकि इसमें कुछ अनपेक्षित परिणाम हैं (इस प्रकार के m_x के अन्य मान्य उपयोगों के लिए गलत संदर्भ दे सकते हैं)।

उदाहरण

struct s1 { 
    int m_x; 
}; 

class someClass { 
public: 
    someStruct m_member; 
#define m_x m_member.x 
#define m_y m_member.y 

    ... 
    void Example(S1& s1) { 
    s1.m_x = 42; // This wouldn't compile and you'd get terrible error messages 
    } 
}; 
+1

ध्यान दें कि यदि आप कक्षा के भीतर मैक्रोज़ को 'undef'' करते हैं, तो ग्राहक उनका उपयोग नहीं कर सकते हैं। लेकिन अगर आप उन्हें 'अनदेखा' नहीं करते हैं, तो परिणाम शायद खराब है। –

+0

@ आर। मार्टिन्हो फर्नांडीस मैं अपने * हैक/मैक्रो * को सबसे छोटे संभव क्षेत्र में सीमित करने की कोशिश कर रहा था :) – JaredPar

+0

मुझे लगता है कि अगर आप इसे 'm_x' ओवरलोड करने जा रहे हैं, तो आप किसी भी मामले में काट लेंगे। –

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