c++ - Copy constructor invokes infinite loop although having call by reference -


पाश को लागू करने वाला कोड:

  फू temp = Foo (token.substr (0 ,मैं)); यह- & gt; बाएंExpression = temp;   

होने के नाते फ़ू घोषित किया गया:

  वर्ग फ़ू {निजी: std :: string expr; std :: vector & lt; बार * & gt; टोकन; std :: vector & lt; std :: string & gt; stringtoken;   

और सीसीटीएआर ने लूप लागू किया है:

  फू :: फ़ू (कॉन्स्ट फू एंड ए_ एक्सप्र।) {This- & gt; expr = a_expr.expr; यह-> टोकन = a_expr.tokens; यह- & gt; स्ट्रिंग टा टोकन = a_expr.stringtoken; }   

क्या इस लूप को लागू किया जा रहा है?

संपादित करें:

असाइनमेंट ऑपरेटर:

  फ़ू & amp; फू :: ऑपरेटर = (कॉन्स्ट फू एंड ए_एक्सप्र।) {फू टेंप (ए_ एक्सप्र); std :: swap (* यह, अस्थायी); वापसी (* यह); }    

समस्या यहां है:

  std :: स्वैप (* यह, अस्थायी);   

std :: swap का डिफ़ॉल्ट कार्यान्वयन असाइनमेंट का उपयोग करता है, इसलिए अनंत ररकॉन्शन को अपने असाइनमेंट ऑपरेटर से बुलाते समय।

यदि आप वास्तव में अपना स्वयं का असाइनमेंट ऑपरेटर लिखना है, फिर अपना खुद का स्वैप लिखें, उदाहरण के लिए:

  void Foo :: swap (Foo और अन्य) {std: : स्वैप; स्वैप (एक्सप्र।, अन्य। एक्सप्र।); // और अन्य सभी सदस्यों के लिए} फू & amp; फू :: ऑपरेटर = (फू अस्थायी) {यह- & gt; स्वैप (अस्थायी); वापसी (* यह); }   

इस मामले में, ऐसा लगता है कि सभी सदस्यों को सही ढंग से कॉपी किया जा रहा है (हालांकि आपको tokens में गूंगा संकेत की सावधानी बरतने की आवश्यकता हो सकती है) यदि ऐसा मामला है, तो अपने स्वयं के डिस्ट्रक्टर को लिखने की कोई आवश्यकता नहीं है, कस्ट निर्माता या प्रति-असाइनमेंट ऑपरेटर बिल्कुल- बस अंतर्निहित लोगों को सही काम करने दो।

Comments

Popular posts from this blog

Verilog Error: output or inout port "Q" must be connected to a structural net expression -

jasper reports - How to center align barcode using jasperreports and barcode4j -

c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -