2010-08-16 8 views
6

सी शैली के अंदर कक्षाओं का आवासीय उपयोग टाइपलेस परिवर्तनीय तर्क सूची एक सामान्य त्रुटि स्रोत है। उदाहरण:सी शैली परिवर्तनीय तर्क सूची में मूल्य के आधार पर कक्षा के उपयोग को प्रतिबंधित करने का कोई तरीका है?

class MyString { 
    public: 
    char *pChars; 
    int Length; 

    MyString(char *pChars) { 
     this->pChars = pChars; 
     Length = strlen(pChars); 
     } }; 

int main() { 
    MyString s1("Bla1"), s2("Bla2"); 
    printf("%s%s", s1, s2); // This does not but should give a compiler warning/error! 
    return 0; } 

printf कॉल वहाँ मूल्य से दो रों वस्तुओं प्राप्त करता है। इसका मतलब है कि उनके सभी सदस्यों को बस स्मृति की प्रतिलिपि बनाई गई है। लेकिन उन्हें एक साधारण चार पॉइंटर्स का अर्थ दिया जाता है। परिणाम निश्चित रूप से एक रनटाइम त्रुटि है।

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

पहले ही घोषित करने की कोशिश की गई है लेकिन प्रतिलिपि बनाने वाले को लागू नहीं किया गया है। लेकिन ऐसा लगता है कि कोई कॉपी कन्स्ट्रक्टर नहीं कहा जाता है। :-(

कृपया सिर्फ शीर्षक में सवाल का जवाब मैं क्यों आप printf या इन चर तर्क सूची का उपयोग नहीं करना चाहिए की एक discusson जरूरत नहीं है -। जानते हैं कि

अपने समय के लिए धन्यवाद

।।
+1

आप किस कंपाइलर का उपयोग कर रहे हैं? – kennytm

+0

"मुझे एक चर्चा की आवश्यकता नहीं है कि आपको printf या इन चरणीय तर्क सूचियों का उपयोग क्यों नहीं करना चाहिए - उसे पता है।" - printf के साथ क्या गलत है? – alternative

+0

मैं विज़ुअल सी ++ –

उत्तर

11

सभ्य compilers (जीसीसी) की तरह की जाँच printf तर्क प्रारूप स्ट्रिंग में प्रारूप विनिर्देशक से मेल खाते हैं या नहीं।

बस -Wformat या -Wall कमांड लाइन विकल्प जोड़ने के लिए मत भूलना।

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

+4

ठीक है, शायद दृश्य सी ++ कोई मूल कंपाइलर नहीं है? –

+2

@kaptnole उन्होंने कम से कम उस मुद्दे के बारे में निर्णय लिया, जिस पर आप अनुभव कर रहे हैं :) http://connect.microsoft.com/VisualStudio/feedback/details/98899/compiler-should-warn-about-passing-objects- को-अंडाकार की गैर-फली-प्रकार-। मुझे पता है कि आप इसे सुनना नहीं चाहते हैं लेकिन प्रिंटफ का उपयोग न करें यहां सलाह देखें http://stackoverflow.com/questions/2017489/should-i-use-printf-in-my-c-code – celavek

+0

@celavek अगर आपने इसे एक के रूप में पोस्ट किया होता तो मैं आपकी टिप्पणी को स्वीकार कर लेता :-) –

0

निकाले जाते हैं boost::noncopyable

+1

यह कैटलिन के उत्तर के बराबर है, और एक ही समस्या है; यह '...' के माध्यम से गुज़रने से नहीं रोकेगा, क्योंकि यह एक प्रतिलिपि नहीं देता है, एक प्रतिलिपि नहीं। –

0

छिपाएं प्रतिलिपि निर्माता और असाइनमेंट ऑपरेटर से (उन्हें निजी घोषित, उन्हें लागू करने की कोई जरूरत नहीं है)। या कक्षा को बढ़ावा देने से प्राप्त करें :: noncopyable (जिसका एक ही प्रभाव है)। मूल्य के आधार पर तर्कों को प्रतिलिपि बनाने वाले प्रतिलिपि का उपयोग निर्धारित करता है।

+2

इसके अलावा यह मदद नहीं करता है क्योंकि उदाहरण मूल्य से पारित नहीं होता है, बल्कि कुछ कच्चे बाइट पास किए जाते हैं और फिर 'reinterpret_cast' -ed 'const char *' पर जाते हैं। मुझे नहीं लगता कि स्थिति से बचने के लिए भाषा-स्तर का मतलब है। आप केवल संकलक चेतावनी पर निर्भर कर सकते हैं (उदाहरण के लिए "गैर-पीओडी ऑब्जेक्ट को पास नहीं कर सकता ...") – visitor

+1

वैसे ओपी ने पहले से ही अपने प्रश्न में कहा था कि उन्होंने कॉपी कन्स्ट्रक्टर के साथ खेला था। क्या आपको लगता है कि असाइनमेंट ऑपरेटर को अधिभारित करने से व्यवहार बदल जाएगा? क्या यह दृश्य सी ++ की एक विशेषता/बग है? –

+0

काम नहीं करता है, कोई प्रति नहीं/असाइनमेंट कन्स्ट्रक्टर कहा जाता है –

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

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