2012-03-19 9 views
8
#include <stdlib.h> 
#include <iostream> 
#include <vector> 
#include <string> 
class A 
{ 
public: 
    std::string s; 
    A() 
    { 
     s = "string"; 
     new(this)A(*this); 
    } 
}; 
int main() 
{ 
    A a; 
    std::cout<<a.s; 
    return 0; 
} 

के अंदर कॉपी कन्स्ट्रक्टर का आविष्कार करना मुझे आउटपुट में खाली स्ट्रिंग मिलती है। इस तरह के व्यवहार के बारे में सी ++ मानक क्या कहता है?अन्य कन्स्ट्रक्टर

+3

औव, मुझे वास्तव में कुछ कॉफी चाहिए। –

+0

मुझे जीसीसी 4.5 – CapelliC

+0

के साथ आउटपुट पर 'स्ट्रिंग' मिला है: 'नया (यह) ए (* यह); अन्य कन्स्ट्रक्टर के अंदर कॉपी कन्स्ट्रक्टर का आह्वान करना? –

उत्तर

4

यहां कम से कम दो समस्याओं होना चाहिए:,

  • आप खुद
  • निर्माता के अंदर की एक प्रति के साथ एक को प्रारंभ करने का प्रयास करें, एक अभी तक पूरी तरह का निर्माण नहीं किया है, इसलिए आप वास्तव में इसे कॉपी नहीं कर सकते

उल्लेख नहीं है कि new(this) स्वयं पर संदेह है।

+1

'नया (यह)' ठीक है। और स्वयं की एक प्रति के साथ कुछ असाइन करना आमतौर पर काम करने की गारंटी भी होती है (एक प्रति असाइनमेंट ऑपरेटर को स्वयं-असाइनमेंट के खिलाफ सुरक्षा की आवश्यकता होती है) - दूसरी तरफ, निर्माण की प्रतिलिपि एक अलग बात है। –

+0

@ कोनराड: तो डिफ़ॉल्ट (जेनरेट) प्रतिलिपि ctor आत्म-असाइनमेंट के खिलाफ संरक्षित है और इसलिए वास्तविक प्रतिलिपि नहीं की जाती है? लगता है कि मध्यवर्ती चर ए (* यह); नई (यह) (क); "समस्या" हल करता है? – user396672

+0

@ user396672 इस तरह के कुछ भी नहीं। डिफ़ॉल्ट * कॉपी असाइनमेंट ऑपरेटर * आत्म-असाइनमेंट के खिलाफ गार्ड। मुझे नहीं लगता कि डिफ़ॉल्ट प्रतिलिपि निर्माता करता है, बस इसलिए कि इस मामले को सामान्य रूप से कभी नहीं होना चाहिए। –

0

आप इसे कर कर s के कन्स्ट्रक्टर को पंक्ति में दो बार बुला रहे हैं, व्यवहार, अपरिभाषित है (और संभवतः कुछ स्मृति लीक हो जाती है)।