2010-02-19 3 views
13

में डिफ़ॉल्ट पैरामीटर के रूप में गैर स्थैतिक सदस्य मैं बड़ी संख्या में कोड को दोबारा जोड़ रहा हूं जहां मुझे कई कार्यों में अतिरिक्त पैरामीटर जोड़ना है, जो हमेशा उस ऑब्जेक्ट के सदस्य का मान रखेगा।सी ++

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object); 
    // used to be void MyFunc(); 
}; 

अब की तरह कुछ है, मैं वास्तव में यह पसंद है पढ़ने के लिए चाहते हैं

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object = A); 
}; 

लेकिन मैं एक डिफ़ॉल्ट पैरामीटर एक गैर-स्थिर सदस्य है कि रखने की अनुमति नहीं कर रहा हूँ। मैंने this similar question पढ़ा है जो सुझाव देता है कि यह संभव नहीं है, लेकिन मुझे आश्चर्य है कि कोई उचित कामकाज है या नहीं। कारण यह है कि 9 5% डिफ़ॉल्ट पैरामीटर का उपयोग किया जाएगा, और इस प्रकार एक डिफ़ॉल्ट पैरामीटर का उपयोग करने से मुझे उस कोड की मात्रा को कम कर दिया जाएगा जो मुझे बदलना है। मेरा सबसे अच्छा समाधान अब तक ऐसा कुछ है;

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(BOOL IsA = TRUE); 
}; 

void MyClass::MyFunc(BOOL IsA) 
{ 
    CMyObject &Object = A; 
    if (!IsA) 
     Object = &B; 
} 

यह elgant से कम है, लेकिन क्या ऐसा करने का एक बेहतर तरीका है कि मुझे याद आ रही है?

संपादित करें: एफडब्ल्यूआईडब्ल्यू, अतिरिक्त पैरामीटर का कारण बहु-थ्रेडिंग की सहायता के लिए वस्तु से संबंधित कुछ राज्य संबंधित सदस्यों को बाहरी करना है।

+0

यदि उसके पास डेटा सदस्य है, तो परिभाषा के अनुसार यह स्टेटलेस नहीं है। –

+0

फेयर पॉइंट नील, टेक्स्ट संपादित। –

उत्तर

18

कैसे के बारे में:

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc() 
    { 
    MyFunc(A); 
    } 
    void MyFunc(CMyObject &Object); 
}; 

?

+0

धन्यवाद बेनोइट, मुझे पता था कि एक बेहतर तरीका होना चाहिए था। स्क्रीन पर बहुत लंबा चल रहा है। –

+0

आपका स्वागत है। ध्यान दें कि सी # और जावा में ओवरलोड की अनुमति नहीं है, और यह क्षतिपूर्ति का तरीका है। तो मुझे लगता है कि मैंने कुछ भी आविष्कार नहीं किया है :-) –

+0

मुझे लगता है कि आपका मतलब है कि सी # और जावा में डिफ़ॉल्ट पैरामीटर की अनुमति नहीं है - वे निश्चित रूप से ओवरलोड (और डिफ़ॉल्ट पैरामीटर सी # 4.0 में स्पष्ट रूप से अनुमति देते हैं) –

4

एक और तरीका है:

class MyClass 
{ 
public: 
    MyObject A,B; 

    void MyFunc(MyObject MyClass::*myObject = &MyClass::A) { 
     MyObject& obj = *(this->*myObject); 
    } 
}; 

यह तो यह और भी असंभव एक और MyClass उदाहरण से एक MyObject सदस्य में पारित करने के लिए बनाता है। MyFunc को कॉल करने के लिए आपके तीन मान्य विकल्प .MyFunc(), .MyFunc(&MyClass::A) और .MyFunc(&MyClass::B)