2009-03-17 6 views
9

लगभग सभी सी ++ परियोजनाओं में कॉपी सी-टोर/कॉपी ऑपरेटर/सीरियलाइज विधि आदि के साथ कक्षाएं होती हैं जो सामान्य रूप से सभी सदस्यों के साथ कुछ कर रही हैं।सी-टोर/कॉपी ओ-टोर/सीरियलाइजेशन रिमाइंडर की प्रतिलिपि बनाने के लिए नया सदस्य जोड़ें

लेकिन कभी-कभी डेवलपर इस कार्य में नए सदस्य को जोड़ना भूल जाते हैं।
क्या आप किसी भी आसान, सभी सदस्यों को लपेटने के बारे में नहीं जानते हैं जो डेवलपर्स को कुछ करने के लिए याद दिलाएंगे या इस फ़ंक्शन में नोप (memeber_name_) लिखेंगे।

मैंने कुछ खोज करने की कोशिश की लेकिन गलती हुई।

पीएस: यूनिट परीक्षण इस समस्या को रोक सकते हैं, लेकिन मुझे कुछ संकलन समय चाहिए।

उत्तर

1
template<class T> 
class SafeMember { 
public: 
    T _; /* short name for convenience */ 
    SafeMember(T const& obj) : _(obj) { } 
}; 

इस तरह उपयोग किया: जब आप एक "SafeMember<int> age" सदस्य जोड़ सकते हैं और भूल जाते हैं अपनी कॉपी-निर्माता अद्यतन करने के लिए

class Student { 
public: 
    Student(string surname, Color hairColor) 
     : surname(surname) 
     , hairColor(hairColor) { } 

    Student(Student const& other) 
     : surname(other.surname) 
     , hairColor(other.hairColor) { } 

    Student& operator=(Student const& other) { 
     surname = other.surname; 
     hairColor = other.hairColor; 
     return *this; 
    } 

    string getSurname() const { return surname._; } 

    // The foo._ syntax is better than implicit conversion because 
    // it lets us call member functions, like substr in this example: 
    bool isSlavic() const {return surname._.substr(surname._.size()-2)=="ev";} 

    void dyeHair(Color newColor) { hairColor = newColor; } 

private: 
    SafeMember<string> surname; 
    SafeMember<Color> hairColor; 
}; 

अब, संकलन सहायक के असफल हो जायेगी।

और "नो-ऑप" संकेत के लिए, डेवलपर "प्रारंभ (0)" जैसे प्रारंभकर्ता को जोड़ देगा।

नोट: यह आपके ऑपरेटर =() या धारावाहिक() फ़ंक्शन को बिट-रॉट से केवल संरक्षक नहीं बचाता है। उम्मीद है कि, यह पर्याप्त होना चाहिए: एक बार जब आप रचनाकारों से अपना चूक देखते हैं, तो आपको शायद अन्य कार्यों के माध्यम से भी जाना याद रहेगा।

+0

"सभी सदस्यों रास्ता wrapp नहीं"। –

+0

खैर, सेफमेम्बर उन्हें लपेटने में काफी आसान बनाता है। मुझे लगता है कि ओपी उन्हें _manually_ लपेटने से बचना चाहता है। –

+0

क्षमा करें, लेकिन यह नए सदस्य चर के साथ काम करता है .. मुझे केवल डिफ़ॉल्ट कन्स्ट्रक्टर के लिए अनुस्मारक मिला है। – bayda

0

ऐसा लगता है कि आपकी समस्या का कोई संतोषजनक समाधान नहीं है (ईरिंबिलानजा समाधान शायद सबसे अच्छे दृष्टिकोणों में से एक है, लेकिन फिर भी यह सही नहीं है)। मुझे आश्चर्य है कि आने वाले सी ++ 0x में विशेषताएं हैं जो इसे हल करने की अनुमति देगी?

+0

मैं स्वीकार्य समाधान खोजने की कोशिश कर रहा हूं :) यह स्वीकार्य होगा यदि सी ++ 0x में समस्या हल करने के लिए कुछ टूल होंगे। मैं सी ++ 0 एक्स ड्राफ्ट की जांच करूंगा। – bayda

+0

शायद संकलक इसे देख सकता है और एक चेतावनी जारी कर सकता है कि कुछ सदस्य की प्रतिलिपि नहीं बनाई गई है ... लेकिन फिर आप कैसे कहेंगे कि आपको कुछ सदस्य की परवाह नहीं है ... –

1

इस कार्यक्षमता को अपने इकाई परीक्षण में जोड़ें। यदि आपके यूनिट टेस्ट में सीरियलज़ैटन/deserialization शामिल हैं (उदाहरण के लिए, deser(ser(x)) == x सुनिश्चित करके), serialization समारोह में सदस्यों को जोड़ने में विफलता इकाई परीक्षण के दौरान विफल हो जाएगा। कॉपी कॉपीर्स के लिए भी यही काम कर सकता है।

यह संकलन समय त्रुटियों के रूप में आदर्श नहीं है, लेकिन यदि आपके पास एक अच्छी इकाई परीक्षण ढांचा है और आप सुनिश्चित करते हैं कि आपके पास उचित कवरेज है, तो उपेक्षा की इन त्रुटियों को बनाना कठिन होगा।

+1

प्रतिक्रिया के लिए धन्यवाद। सामान्य रूप से: इकाई परीक्षण - अच्छी बात, और मैंने इकाई परीक्षण के साथ नियंत्रण के बारे में सोचा। लेकिन हम ऑपरेटर == में सदस्य जोड़ना भूल सकते हैं और जोर दे सकते हैं (deserialize (serialize (x)) == x) या 'y = x; जोर दें (वाई == एक्स); ठीक है अगर हम कुछ उपयोग किए गए कार्यों में सदस्य जोड़ना भूल जाते हैं। – bayda

0

मुझे लगता है कि इस समस्या से बचने का सबसे अच्छा तरीका रूट पर इसे काट रहा है: कस्टम कॉपी ऑपरेटर/कन्स्ट्रक्टर का उपयोग न करें।

यह हमेशा संभव नहीं हो सकता है, लेकिन ज्यादातर मामलों में मैं वास्तव में लगता है कि यह है ...

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