2011-12-26 16 views
11

के साथ असाइनमेंट ऑपरेटर जब तक मेरे पिछले प्रश्न Overloaded assignment operator causes warning about recursion से नए मुद्दे बढ़ रहे हैं, तो मुझे वैध रूप से इसे नए के रूप में पोस्ट करने का आग्रह किया गया था। मेरे क्लास प्लेयर में एक संदर्भ वर्ग सदस्य है और मैं इस वर्ग के कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर (=) को कार्यान्वित करना चाहता हूं। मुझे यह उल्लेख करना होगा कि उद्देश्य फ़ंक्शन वेक्टर.रस का अच्छा काम है क्योंकि इसके बिना यह ठीक से काम नहीं करता है, जहां तक ​​मेरा संबंध है। मैं एक वेक्टर का उपयोग करता हूं: वेक्टर ऑलप्लेयर; वर्ग प्लेयर के सदस्य हैं:संदर्भ वर्ग सदस्य

class Player 
{ 

    private: 
    int ID; 
    int pMoney; 
    int doubleIndicator; 
    int squarePosition; 
    Bank& bank; 
    string pName; 
    Square* capturedSquare; 
    multimap<string, PropertySquare*> squaresColBought; 
    multimap<string, House*> housesColBuilt; 

} 

यह वर्ग के सदस्य के रूप में संदर्भ के उपयोग से बचने के लिए अगर मैं असाइनमेंट ऑपरेटर लागू करना चाहते हैं अनिवार्य है? मानचित्र सदस्यों के बारे में क्या? अंततः मुझे असाइनमेंट ऑपरेटर को कैसे कार्यान्वित करना चाहिए?

अत्यधिक महत्व का एक और मुद्दा जिसमें मुझे अनजान है, पॉइंटर्स क्लास सदस्यों द्वारा इंगित वस्तुओं के साथ क्या होता है जब मैं प्लेयर धारक वेक्टर के इटरेटर को मिटा देता हूं। कोई मदद?

+0

"एक और मुद्दा" => शुरुआत :) – xtofl

+0

क्या आप असाइनमेंट ऑपरेटर बैंक के साथ क्या करना चाहते हैं के लिए एक और सवाल? – fredoverflow

+0

FredOverflow: बस एलएचएस वस्तु के लिए बैंक को कॉपी करने के – arjacsoh

उत्तर

7

जब आप असाइनमेंट ऑपरेटर चाहते हैं तो मैं एक संदर्भ सदस्य का उपयोग करने से बचूंगा। आप के बजाय एक (स्मार्ट) सूचक का उपयोग करते हैं, तो आप सिर्फ

Player &operator=(Player const &other) 
{ 
    bankPtr = other.bankPtr; 
    // copy other members 
} 

वर्तमान स्थिति में, bank = other.bank करना बजाय other.bank द्वारा संदर्भित सामग्री के this->bank ओर इशारा करते हुए की other.bank की सामग्री की प्रतिलिपि जाएगा कर सकते हैं।

multimap -typed सदस्यों का सवाल है, वे समस्याओं के बिना कॉपी किया जा सकता है, लेकिन ध्यान रखें कि आप चाबियों का एक "गहरी" कॉपी मिल जाएगा (क्योंकि वे प्रकार string की कर रहे हैं), लेकिन एक "उथले "मानों की सूचक प्रति, ताकि आप साझा स्थिति के साथ समाप्त हो जाएं। आप मानों के लिए shared_ptr का उपयोग करना चाह सकते हैं।

13

एक C++ 'संदर्भ' केवल प्रारंभ किया जा सकता है, नहीं सौंपा:

int value1(1), value2(2); 
int& ref1 = value1; // OK 
int& ref2; // compile error: reference not initialized 
int& ref3=ref1; // OK: ref3 refers to the same variable as ref1 
ref1=value2; // equivalent to 'value1=value2'. 

वजह, एक वस्तु एक संदर्भ केवल प्रारंभ किया जा सकता है, जिसमें भी!

तो वास्तव में: यदि आपको कक्षा में असाइनमेंट की आवश्यकता है, तो उस वर्ग में संदर्भ सदस्य चर नहीं हो सकते हैं।

जब आप इस बारे में सोचते हैं, यह बनाता है (वास्तव में, यह हो सकता है, लेकिन काम के इन सदस्यों को किसी अन्य स्थान का उल्लेख नहीं कर सकते हैं एक मामले के रूप) भावना:

संदर्भ अवधारणा किसी अन्य के लिए परिभाषित करता है 'एक उपनाम' चर। एलियासिंग का तात्पर्य है कि आप अपने संदर्भ में जो भी करते हैं, आप वास्तव में संदर्भित स्थान पर करते हैं। जब आप इस उपनाम को असाइनमेंट लागू करते हैं, तो वास्तव में आप संदर्भित स्थान को असाइन करते हैं। संदर्भ के प्रयोजन के खो जाएगा अगर आप इसे काम का उपयोग कर एक अलग स्थान को इंगित कर रही करने में सक्षम थे।

तो बाद आप क्या जरूरत है, तो आप एक सूचक का उपयोग करना चाहिए।

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