2010-02-19 14 views
8

मैं फार्म के एक निर्माता है में निर्माता में संख्यात्मक प्रकार के निहित कलाकारों की रोकथाम:सी ++

MyClass (int एक, int ख, पूर्णांक ग);

और इसे इस तरह कोड के साथ बुलाया जाता है:

MyClass my_object (4.0, 3.14, 0.002);

मैं इस स्वचालित रूपांतरण को डबल से int तक रोकना चाहता हूं, या कम से कम संकलन समय पर चेतावनियां प्राप्त करना चाहता हूं।

ऐसा लगता है कि "स्पष्ट" कीवर्ड इन मामलों में काम नहीं करता है, है ना?

+2

एक कलाकार परिभाषा द्वारा स्पष्ट है। आपका शीर्षक शीर्षक में "निहित रूपांतरण" है। –

उत्तर

9

आपका कंपाइलर क्या है? जीसीसी के तहत, आप इस प्रकार के रूपांतरणों के बारे में आपको चेतावनी देने के लिए -Wconversion का उपयोग कर सकते हैं।

+0

मैं जीसीसी का उपयोग करता हूं, और -वचनवर्जन ने काम किया! मैंने सोचा कि -वॉल इसमें शामिल होगा, लेकिन स्पष्ट रूप से यह नहीं है! बहुत बहुत धन्यवाद! – Hugo

+2

-वॉल में बहुत सारी चीज़ें नहीं हैं और यहां तक ​​कि नहीं -Wall -Wextra में सब कुछ शामिल है। मैं वास्तव में सभी चेतावनियों को सक्षम करने के लिए एक स्विच करना पसंद करूंगा और फिर उन लोगों को अक्षम कर दूंगा जो एक-एक करके परेशानी पैदा कर रहे हैं। – Tronic

+1

व्यक्तिगत रूप से, मैं '-Wall -Wextra -pedantic -Wformat = 2 -Wstrict-overflow = 3 -Werror' के साथ संकलित करता हूं। मैं विकास के दौरान '-वनो-अप्रयुक्त' जोड़ता हूं क्योंकि मेरे पास अक्सर चीजें हैं जो मैं अभी तक उपयोग करने के लिए तैयार नहीं हूं, लेकिन मैं उन्हें वहां चाहता हूं क्योंकि मुझे पता है कि मुझे उनकी आवश्यकता होगी। –

2

एक निजी MyClass(double a, double b, double c) कन्स्ट्रक्टर घोषित करें।

5

इस तरह एक निजी निर्माता घोषित:

private: 
template <class P1, class P2, class P3> 
MyClass(P1,P2,P3); 

कि 3 मानकों कि सभी int नहीं हैं उपयोग कर किसी भी निर्माण के लिए एक संकलन समय त्रुटि हो जाएगा, और यह पोर्टेबल है।

+0

यह चालाक है। :-) चेतावनी समाधान थोड़ा क्लीनर है, लेकिन आपका समाधान किसी भी अनुरूप कंपाइलर पर काम करता है। :-) दुर्भाग्य से यह कक्षा के निर्माण के खिलाफ सीधे सुरक्षा के खिलाफ सुरक्षा नहीं करता है। आपको उनको पकड़ने के लिए लिंक समय तक इंतजार करना होगा। – Omnifarious

+0

@ ओमनिफरीस: सी ++ 0x के साथ आप इस अधिभार को '= हटाएं' के साथ चिह्नित करेंगे; अन्यथा, यदि आप आंतरिक दुरुपयोग के बारे में चिंतित थे, तो आप एक कार्यान्वयन प्रदान कर सकते हैं जो संकलित करने में विफल रहता है (उदाहरण के लिए स्थैतिक दावे के कारण)। – visitor

+0

Cleverer: एक दूसरा अधिभार 'टेम्पलेट <कक्षा पी 1, कक्षा पी 2, कक्षा पी 3> MyClass (पी 1, पी 2, पी 3, पी 3 * डमी = 0) जोड़ें; '। दो टेम्पलेट्स के बीच ओवरलोड रिज़ॉल्यूशन संदिग्ध होगा, लेकिन यह अप्रासंगिक है यदि दोनों 'MyClass (int, int, int)' – MSalters