2010-11-05 9 views
5

माफ़ी माफ़ी अगर यह एक डुप्ली है। मुझे कई पदों को फिर से मिला। निहित रूपांतरणों को रोकना, लेकिन कुछ भी नहीं। अंतर्निहित निर्माण को प्रोत्साहित करना।किसी ऑब्जेक्ट का अंतर्निहित निर्माण करने के लिए मैं किसी फ़ंक्शन को किस तर्क को पास कर सकता हूं?

तो मेरे पास है:

class Rect 
{ 
public: 
    Rect(float x1, float y1, float x2, float y2){}; 
}; 

और नि: शुल्क समारोह:

Rect Scale(const Rect &); 

क्यों

Rect s = Scale(137.0f, 68.0f, 235.0f, 156.0f); 

एक const Rect& का एक अंतर्निहित निर्माण नहीं करेंगे और बदले में इस संकलक त्रुटि उत्पन्न

'Scale' : function does not take 4 arguments 
+1

यदि आप इसे मजबूर कर रहे हैं, तो यह निहित नहीं है! – RQDQ

उत्तर

11

क्योंकि भाषा इस सुविधा का समर्थन नहीं करती है। आपको

Rect s = Scale(Rect(137.0f, 68.0f, 235.0f, 156.0f)); 
+3

... या 4 फ्लोट स्वीकार करने के लिए स्केल स्केल करें। – visitor

7

सी ++ में "रूपांतरण" एक प्रकार और अन्य प्रकार की वस्तुओं के बीच हैं। आपके पास 4 ऑब्जेक्ट्स हैं (सभी प्रकार की फ्लोट), इसलिए आपके पास 4 अन्य प्रकार के 4 रूपांतरण हो सकते हैं। 4 वस्तुओं को एक ऑब्जेक्ट में कनवर्ट करने का कोई तरीका नहीं है (शब्द की सी ++ भावना में)।

2

मुझे लगता है कि आप किसी ऑब्जेक्ट को अंतर्निहित रूप से बनाने के बारे में बात कर रहे हैं। उदाहरण के लिए,

class IntWrapper { 
    public: 
     IntWrapper(int x) { } 
}; 

void DoSomething(const IntWrapper&) { } 

int main() { 
    DoSomething(5); 
} 

यह काम करता है क्योंकि IntWrapper के निर्माता केवल एक तर्क लेता है। आपके मामले में, Rect को 4 तर्कों की आवश्यकता है, इसलिए कोई अंतर्निहित निर्माण नहीं है।

+0

इस प्रश्न को 'स्पष्ट' पर देखें, जिस तरह से आप इस व्यवहार को मना करते हैं: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

3

कन्स्ट्रक्टर के माध्यम से एक निहित रूपांतरण होता है यदि केवल और अगर निर्माता वास्तव में 1 तर्क लेता है और स्पष्ट घोषित नहीं किया जाता है। इस मामले में यह 4 लेता है, इस प्रकार परिणाम।

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

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