2010-09-09 17 views
6

मैं एक वर्ग परिभाषा निम्न के समान है:डिफ़ॉल्ट प्रतिलिपि काम

class UUID 
{ 
    public: 
    // Using implicit copy assignment operator 

    private: 
    unsigned char buffer[16]; 
}; 

मैं सिर्फ एक इकाई परीक्षण मुझ पर असफल है कि पुष्टि करने गया था कि प्रति काम ठीक से काम किया है। मेरे आश्चर्य के लिए, बफर [] सरणी के बीच में एक बाइट गलत तरीके से कॉपी किया गया था।

मेरे समझ डिफ़ॉल्ट प्रति असाइनमेंट ऑपरेटर प्रदर्शन करती है कि सदस्य वार नकल, और कहा कि सरणी सदस्यों के लिए (पॉइंटर करने वाली सरणी सदस्य नहीं) है कि सरणी के elementwise प्रतिलिपि जरूरत पर जोर देता है। क्या मैं गलत हूँ?

मेरे पेट यहाँ लग रहा है कि मैं एक झूलने सूचक कहीं कि मेरे सरणी के बीच पर stomped है ने काट लिया गया है। लेकिन, मैं इसे दोहराना देख रहा हूं, उदाहरण के लिए मैं इन वस्तुओं के एक वेक्टर को दूसरे वेक्टर में कॉपी करता हूं।

कोई मुझे यह बताने की परवाह करता है कि मैं गलत कहां गया हूं?

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

यदि यह कुछ पर विस्तार करने के लिए, कक्षा एक पॉड प्रकार नहीं है - यह कुछ सार आधार वर्ग से निकला है और इस तरह एक आभासी नाशक है। हालांकि, सरणी केवल डेटा सदस्य है, और उपयोग जो इकाई परीक्षण में तोड़ दिया यह था:

const int n = 100; 

std::vector<UUID> src, dst; 
src.reserve(n); 
dst.resize(n); 

for (int i = 0; i < n; ++i) { 
    UUID id; 
    src.push_back(id); 
} 

for (int i = 0; i < n; ++i) { 
    dst[i] = src[i]; 
} 

bool good = true; 
for (int i = 0; i < n; ++i) { 
    const bool thisGood = (dst[i] == src[i]); 

    std::cout << "i = " << i << " -> src = '" << src[i] 
      << "', dst = '" << dst[i] << "', src == dst ? " 
      << thisGood << '\n'; 

    good = (good && thisGood); 
} 
+0

आप कैसे पता चला 'बफर [] सरणी गलत ढंग से कॉपी के बीच में एक बाइट। " परीक्षण मामले के साथ दिखाया गया है? क्या कोई विशेष प्रविष्टि (100 में से) है जो दूषित हो रही है? – Chubsdad

+0

@Chubsdad: यूयूआईडी कक्षा में एक स्ट्रीम इंसर्टर अधिभारित है जो सदस्य सरणी की सामग्री को डंप करता है। इस परीक्षण के मामले में, वेक्टर के सभी 100 तत्वों में उनके बफर [9] बाइट दूषित होते हैं, ठीक उसी मूल्य के लिए। –

+0

ठीक है। क्या ओवरलोडेड ऑपरेटर == दिखाना संभव है? – Chubsdad

उत्तर

9

मेरे समझ के साथ कि डिफ़ॉल्ट प्रति असाइनमेंट ऑपरेटर प्रति सदस्य वार निष्पादित करता है, और कहा कि सरणी सदस्यों के लिए (पॉइंटर-टू-एरे सदस्यों नहीं) जो सरणी की तत्ववार प्रतिलिपि में शामिल थे।

हां। यह सही है।

आपकी समस्या प्रति असाइनमेंट ऑपरेटर के साथ (जब तक आप कुछ असामान्य संकलक बग, जो की संभावना नहीं है पाया है) नहीं है।

+0

मेरे संदेह की पुष्टि करने के लिए धन्यवाद । कुछ डीबगर जादू के लिए समय, मुझे लगता है ... –

+0

@Drew: शुभकामनाएँ! :-) –

+0

धन्यवाद! मुझे लगता है कि मुझे इसकी आवश्यकता होगी। बीटीडब्ल्यू, मैंने एक संपादन में कुछ अतिरिक्त टेक्स्ट/टेस्ट केस कोड जोड़ा। मुझे नहीं लगता कि यह कुछ भी बदलता है लेकिन सोचा कि मैं इसे आपके ध्यान में लाऊंगा। –

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