2013-09-05 10 views
6

के आत्म आरंभीकरण चेतावनी दी है की तरह कुछ कर रही द्वारा काटा गया है के बाद:से बचें/C++ सदस्यों

struct Person { 

    std::string first_name; 
    std::string last_name; 
    Person(const std::string &first_name_, const std::string &last_name_) : 
    first_name(first_name_), 
    last_name(last_name) 
    {} 
}; 

प्रारंभकर्ता last_name(last_name) कहाँ स्पष्ट रूप से होना चाहिए last_name(last_name_) हैं वहाँ किसी भी तरह से मैं जीसीसी इस तरह के एक त्रुटि के बारे में चेतावनी बना सकते हैं (क्या किसी सदस्य का उपयोग स्वयं शुरू करने का कोई भी उपयोग केस है?)

या उन मामलों में बेहतर नामकरण सम्मेलन पर कोई सुझाव जहां कंस्ट्रक्टर तर्क फ़ील्ड के समान हैं।

+1

सबसे व्यापक सम्मेलन की तरह "एम" (सदस्य) या "च" (क्षेत्र) एक पत्र के साथ सदस्यों उपसर्ग है। "MLastName" या "m_last_name" की तरह। यह न केवल इस विशिष्ट समस्या के कारण उपयोगी है, बल्कि यह भी कि आप तुरंत जानते हैं कि अगर कोई उपसर्ग है तो कोई सदस्य चर है। यह गलत होने की भी कम संभावना है; "_" प्रत्यय अभी भी स्वत: पूर्णता दोनों तर्क और सदस्य दोनों का सुझाव देने की अनुमति देता है। एक उपसर्ग के साथ यह अक्सर नहीं होता है। –

+0

@ निकोससी। जब मैंने प्रोग्रामिंग शुरू की, तो मैं अन्य हंगेरी नोटेशन के साथ-साथ फ़ंक्शन पॉइंटर्स आदि के लिए m_pfnFoo जैसी चीज़ों का उपयोग करता हूं। फिर एक प्रयोग के रूप में मैंने इसे छुटकारा पाने का फैसला किया, और वास्तव में इसे कभी याद नहीं किया। मेरे पास यह धारणा है कि जब आपकी कक्षाओं को ध्यान से तैयार किया जाता है तो यह कोई लाभ नहीं देता है। – stijn

+0

@stijn मुझे यह बहुत उपयोगी लगता है खासकर जब अन्य लोगों के कोड को पढ़ते हैं। यह इसे समझने में थोड़ा आसान बनाता है। मुझे अक्सर मेरे आईडीई की लुकअप कार्यक्षमता का उपयोग करता है, जो एक अच्छी बात है :) –

उत्तर

9

मैं उसी नाम का उपयोग करके सदस्यों के नाम के रूप में तर्क के लिए इस मुद्दे से बचता हूं। लुकअप नियम निर्दिष्ट करते हैं कि नाम किसी सदस्य प्रारंभकर्ता में उपयोग किए जाने पर तर्क को संदर्भित करता है।

अगर कन्स्ट्रक्टर बहुत जटिल है तो सूक्ष्म त्रुटियों का दायरा है; लेकिन अगर आप प्रारंभिक सूची में सदस्यों को शुरू कर रहे हैं तो कोई समस्या नहीं है।

अन्यथा, जीसीसी और अधिक विशेष रूप -Wuninitialized-Wall (या शायद -Wextra) की तरह समझदार चेतावनी सेटिंग्स के साथ एक uninitialised मूल्य का उपयोग कर, या के बारे में चेतावनी दे देंगे। मुझे लगता है कि -Winit-self या इसी तरह के भी हो सकते हैं, यदि आप और भी विशिष्ट होना चाहते हैं।

+3

+1। यह सबसे अच्छा है, क्योंकि यह एक ही इकाई के लिए दो नाम सोचने से बचाता है। सरल समाधान आमतौर पर सबसे अच्छे होते हैं। – Nawaz

+1

@ जोनासविएलिकी: पर्याप्त मेला। मैं हमेशा '-Wall -Wextra' का उपयोग करता हूं, और इस मुद्दे को कभी भी सामना नहीं करता, इसलिए मुझे नहीं पता कि आपको वास्तव में क्या चाहिए। –

+0

मैंने अभी परीक्षण किया है, '' -Wall'' * लगता है * अब काम करने के लिए, यह जीसीसी 4.8 के साथ बदल सकता है। –

7

हां; -Wuninitialized और -Winit-self:

$ g++ -Wuninitialized -Winit-self -c init.cpp 
init.cpp: In constructor 'Person::Person(const string&, const string&)': 
init.cpp:7:3: warning: 'Person::last_name' is initialized with itself [-Wuninitialized] 
+0

मैंने "अपरिचित विकल्प" पर चकित किया :) – jrok

+1

@jrok Hehe - मैं अपने जीवन के लिए नहीं चल सकता। – trojanfoe

+0

जब मैं g ++ (सीधे ऑब्जेक्ट बिल्ड) का उपयोग करता हूं तो उपर्युक्त त्रुटि नहीं होती है। कोई विशिष्ट कारण? यहां तक ​​कि -Wall –

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