2011-01-12 12 views
8

मेरे पास दो int तर्कों के साथ विभिन्न कार्य हैं (मैं दोनों कार्यों और कॉलिंग कोड को स्वयं लिखता हूं)। मैं कुछ कॉल में तर्क के आदेश को भ्रमित करने से डरता हूं।सी ++: टाइप दो सुरक्षा के प्रकारों को अलग करने के लिए प्रकार सुरक्षा का उपयोग

मैं कंपाइलर को चेतावनी देने या मुझे त्रुटि देने के लिए टाइप सुरक्षा का उपयोग कैसे कर सकता हूं यदि मैं तर्कों के गलत अनुक्रम के साथ फ़ंक्शन को कॉल करता हूं (सभी तर्क int हैं)?

मैं typedefs की कोशिश की: typedef किसी भी संकलक चेतावनियों या त्रुटियों को चालू नहीं करते:

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

foo(y,x); // compiled without warning) 
+1

आपको यह उपयोगी कुछ मिल सकता है: http://calumgrant.net/units/units.html –

उत्तर

12

आपको रैपर कक्षाएं बनाना होगा। मान लें कि आपके पास दो अलग-अलग इकाइयां हैं (कहें, सेकंड और मिनट), जिनमें से दोनों को इंक के रूप में दर्शाया जाता है। आप निम्नलिखित की तरह कुछ की जरूरत पूरी तरह से typesafe मानेंगे:

class Minute 
{ 
public: 
    explicit Minute(int m) : myMinute(m) {} 
    operator int() const { return myMinute; } 

private: 
    int myMinute; 
}; 

और सेकंड के लिए एक समान वर्ग। स्पष्ट कन्स्ट्रक्टर आपको को Minute के रूप में गलती से उपयोग करने से रोकता है, लेकिन रूपांतरण ऑपरेटर आपको Minute का उपयोग करने की अनुमति देता है, जहां आपको int की आवश्यकता होती है।

+5

अधिक पूर्ण और सामान्य कार्यान्वयन के लिए आप http://www.boost.org/doc/libs भी देख सकते हैं /1_42_0/boost/strong_typedef.hpp – UncleBens

4

typedef उपनाम टाइप पैदा करता है। जैसा कि आपने पाया है, वहां कोई प्रकार की सुरक्षा नहीं है।

एक संभावना, जो आप प्राप्त करने की कोशिश कर रहे हैं उसके आधार पर, enum का उपयोग करना है। यह पूरी तरह से टाइपएफ़ नहीं है, लेकिन यह करीब है। उदाहरण के लिए, आप इसे कास्ट किए बिना एनम पैरामीटर के लिए एक int पास नहीं कर सकते हैं।

-5

पोस्ट-नोट प्राप्त करें। बड़े अक्षरों में इसे लिखें, "एक्स FIRST! फिर वाई!" इसे अपने कंप्यूटर स्क्रीन पर चिपकाएं। मैं ईमानदारी से नहीं जानता कि सलाह देने के लिए और क्या है। रैपर वर्गों का उपयोग करना निश्चित रूप से अधिक होता है, जब समस्या को पोस्ट-और जादूगर के साथ हल किया जा सकता है।

+5

भौगोलिक सॉफ्टवेयर के डेवलपर्स से पूछें। क्या यह लेट/लम्बा या लंबा/लेट है? एक क्लासिक केस जहां रैपर वर्ग काम करते हैं, और इसके बाद पोस्ट नहीं करते हैं। – MSalters

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