2013-02-22 17 views
5

इस वर्ग निम्न त्रुटि अप फ़्लैगिंग है: 'गैर स्थिर स्थिरांक सदस्य' स्थिरांक पूर्णांक सदस्य :: membershipNo ', डिफ़ॉल्ट असाइनमेंट ऑपरेटर उपयोग नहीं कर सकते'। अजीब बात यह है कि यह कोड किसी अन्य प्रोजेक्ट में दोहराया गया है और पूरी तरह से काम करता है। क्या आप इसे सही रखने में मेरी मदद कर सकते हैं?'टाइप नॉन-स्टेटिक कॉन्स सदस्य डिफ़ॉल्ट असाइनमेंट ऑपरेटर का उपयोग नहीं कर सकता' - इसका क्या अर्थ है?

Member.h

class Member : public Person 
    { 
    public: 
     Member(); 
     Member(int membershipNo); 
     virtual ~Member(); 

     int getMembershipNo() const; 

    private: 
     const int membershipNo; 

     friend class boost::serialization::access; 
     template<class Archive> 
     void serialize(Archive& ar, const unsigned int version) 
     { 
      ar & boost::serialization::base_object<Person>(*this); 
      ar & membershipNo; 
     } 

    }; 

Member.cpp

Member::Member() : membershipNo(0) 
{ 
    Person(); 
} 

Member::Member(int memberNo) : membershipNo(memberNo) 
{ 
    Person(); 
} 

Member::~Member() 
{ 
    // TODO Auto-generated destructor stub 
} 

int Member::getMembershipNo() const 
{ 
    return membershipNo; 
} 

उत्तर

7

मुमकिन है, अपने कोड में कहीं न कहीं आप एक Member, कुछ इस तरह के बताए जाते हैं:

Member m1, m2; 
m1 = m2; 

या आप एक संदर्भ है कि प्रकार की आवश्यकता है आबंटित होने के लिए प्रयोग कर रहे हैं।

जब से तुम Member के लिए अपने स्वयं के असाइनमेंट ऑपरेटर अधिभार प्रदान नहीं करते हैं, परोक्ष परिभाषित डिफॉल्ट की असाइनमेंट ऑपरेटर आमतौर पर में किक जाएगा। हालांकि, बाद से आप एक const डेटा सदस्य है, संकलक परोक्ष आप के लिए एक परिभाषित नहीं होंगे। आप इसे को अपने आप को प्रदान करने के लिए की आवश्यकता है।

यह समझ में आता है क्योंकि, मैंने अभी दिए गए कोड नमूने में कल्पना की है, संकलक m1 के membershipNo सदस्य को क्या करना चाहिए? क्या इसे m2 के membershipNo को असाइन करना चाहिए? यह कैसे कर सकता है यदि membershipNoconst है? इस मामले में, कंपाइलर बस कहता है "नहीं, मैं इसे नहीं कर सकता।"

Member& Member::operator=(const Member& other) 
{ 
    // Copy things from other to this 
} 

हालांकि, इस के साथ साथ const सदस्यों होने के साथ समस्या है:

A defaulted copy/move assignment operator for class X is defined as deleted if X has:

  • a non-static data member of const non-class type (or array thereof)
  • [...]

जैसा कि मैंने कहा, एक Member साथ काम करने के लिए सक्षम होने के लिए, आप अपने खुद के एक असाइनमेंट ऑपरेटर प्रदान करने के लिए की जरूरत है। आप अपने खुद के प्रति असाइनमेंट ऑपरेटर के रूप में वर्णित की आपूर्ति, और आप membershipNo से अधिक प्रतिलिपि नहीं कर है, तो आप वास्तव में अन्य वस्तु की नकल की है? तार्किक रूप से, यह भावना है कि एक वस्तु है कि किसी भी const राज्य है को सौंपा जा करने में सक्षम नहीं होना चाहिए बनाता है।

हालांकि यह एक प्रति निर्माता का उपयोग करने के बिल्कुल ठीक है - आप केवल सुनिश्चित करें कि आप सदस्य प्रारंभ सूची में membershipNo आरंभ करना है:

Member::Member(const Member& other) 
    : membershipNo(other.membershipNo) 
{ 
    // ... 
} 

और फिर आप कर सकते हैं:

Member m1; 
Member m2 = m1; 
+0

आह हाँ, धन्यवाद। तो क्या प्रतिलिपि बनाने वाले किसी ऑब्जेक्ट का प्रतिलिपि बनाने का कोई तरीका नहीं है जिसमें डेटा है? – Armada

+0

@Frammo कॉपी कन्स्ट्रक्टर पूरी तरह से ठीक है। प्रतिलिपि असाइनमेंट नहीं है - जब तक कि आप अपना खुद का प्रदान न करें। –

+1

@Frammo और समझाया! –

2

क्या हो रहा है कुछ क्लाइंट कोड एक-दूसरे से से एक Member उदाहरण आवंटित उपयोग करने के लिए प्रयास कर रहा है है। चूंकि आपके पास निरंतर डेटा सदस्य है, यह काम नहीं कर सकता है। त्रुटि केवल तभी आती है जब कुछ कोड असाइनमेंट करने का प्रयास करते हैं, यही कारण है कि यह किसी अन्य प्रोजेक्ट में एक ही कक्षा "काम करता है" प्रतीत होता है।

यह सही डाल के संदर्भ में, विकल्प ए) काम नहीं करने के लिए, या बी) डेटा सदस्य गैर स्थिरांक बनाते हैं।

+0

आह हाँ आप सही है। धन्यवाद। तो क्या ऐसे उदाहरण को प्रतिलिपि/असाइन करने का कोई तरीका नहीं है जिसमें सदस्य हैं?प्रतिलिपि बनाने के नियमों को बदलने के नियमों को तोड़ने के नियम क्यों तोड़ेंगे? – Armada

+1

@Frammo प्रतिलिपि ठीक है। असाइन करना नहीं है। जब आप एलएचएस = आरएचएस असाइन करते हैं, एलएचएस पहले से ही शुरू कर दिया गया है और असाइनमेंट का अर्थ राज्य में बदलाव का तात्पर्य है। और यदि राज्य स्थिर है ... – juanchopanza