2010-09-10 10 views
6

मेरे पास एक संरचना है:मैं C++ फ़ंक्शन में संरचना के लिए डिफ़ॉल्ट मान कैसे निर्दिष्ट कर सकता हूं?

typedef struct { 
    double x,y,z; 
} XYZ; 

मैं इस तरह के फ़ंक्शन को परिभाषित करना चाहता हूं:

double CalcDisparity(XYZ objposition, 
        XYZ eyeposition, 
        double InterOccularDistance = 65.0) 

लेकिन मुझे eyeposition के लिए डिफ़ॉल्ट मान असाइन करने का कोई तरीका नहीं दिख रहा है। मैं इसे C++ में कैसे कर सकता हूं?

+0

क्या यह सीधी सी या सी ++ है? – diverscuba23

+3

@drknexus, सी ++ में एक संरचना बिल्कुल कक्षा के समान ही है, सिवाय इसके कि यह सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं जबकि कक्षा के सदस्य डिफ़ॉल्ट रूप से निजी होते हैं। बस। संरचनाओं में रचनाकार, विनाशक, विधियां, मूल रूप से कक्षा में सबकुछ हो सकता है। अब यदि आप सी के बारे में बात कर रहे हैं तो वे फिर से अलग हैं, इसलिए आपको स्पष्ट होना चाहिए कि आप किस भाषा के बारे में बात कर रहे हैं – Glen

+0

यह सी ++ है, इसलिए मैंने प्रश्न से सी को हटाने के लिए प्रश्न और टैग संपादित कर दिए हैं। –

उत्तर

11

यह

struct XYZ{ 
    XYZ(double _x, double _y, double _z) : x(_x), y(_y),z(_z){} 
    XYZ() : x(0.0), y(42.0), z(0.0){} 

    double x, y, z; 
}; 

इसलिए मैं अब एक डिफ़ॉल्ट निर्माता है कि है। तो फिर तुम इसे इस तरह कहते हैं:

double CalcDisparity(XYZ objposition = XYZ(), 
         XYZ eyeposition = XYZ(), 
         double interOccularDistance = 65.0) 

लेकिन वहाँ एक छोटी सी चाल है: आप 1 और केवल 3 तर्क के लिए कोई डिफ़ॉल्ट मान नहीं कर सकते। एक और बात: सी एक भाषा है, सी ++ एक और भाषा है।

+0

यदि आप अतिरिक्त रचनाकारों को परिभाषित कर सकते हैं, उदाहरण के लिए: 'संरचना XYZ {XYZ (डबल _x, डबल _z): एक्स (_x), वाई (42.0), जेड (_z)}; डबल CalcDisparity (XYZ objposition = XYZ(), XYZ eyeposition = XYZ (1.0, 2.0), डबल इंटरऑक्लियरडिस्टेंस = 65.0); ' –

1
  1. आप XYZ ऑब्जेक्ट्स बनाने के लिए फ़ैक्टरी फ़ंक्शन लिख सकते हैं, और फ़ंक्शन को डिफ़ॉल्ट मान के रूप में कॉल कर सकते हैं।

  2. आप डिफ़ॉल्ट मान को शून्य बना सकते हैं, और यदि तर्क शून्य है, तो डिफ़ॉल्ट XYZ बनाते समय फ़ंक्शन में जांचें।

  3. वैश्विक XYZ ऑब्जेक्ट बनाएं और इसे डिफ़ॉल्ट के रूप में असाइन करें।

  4. यदि आपको शुद्ध सी के बजाय सी ++ का उपयोग करने में कोई फर्क नहीं पड़ता है, तो XYZ को एक कन्स्ट्रक्टर के साथ कक्षा बनाएं।

वे सभी तरीके हैं जो संकलित और काम करेंगे, लेकिन कुछ अच्छे कोडिंग प्रथा नहीं हो सकते हैं।

+0

यदि वह सी ++ का उपयोग कर रहा है तो वह इसे एक स्ट्रक्चर के रूप में छोड़ सकता है, लेकिन इसे एक कन्स्ट्रक्टर – Glen

2

C में, फ़ंक्शन तर्कों में डिफ़ॉल्ट मान नहीं हो सकते हैं (C++ के बारे में नहीं जानते)।

आप क्या कर सकते हैं, C में, एक (किसी भी तरह) अमान्य मान पास है, उस अमान्य मान की जांच करें और इसके बजाय किसी अन्य का उपयोग करें।

int foo(int n) { 
    if (n == -1) { /* -1 is invalid */ 
    n = 42;  /* use 42 instead */ 
    } 
    /* ... */ 
} 
+0

दें दिया गया था, सवाल 'सी' टैग किया गया था; तब से टैग हटा दिया गया है क्योंकि सी तर्कों के लिए डिफ़ॉल्ट मानों का समर्थन नहीं करता है। –

+0

सी ++ डिफ़ॉल्ट मानों का समर्थन करता है। – andand

-1

आप मेरे समाधान के एक हिस्से के साथ अंतिम समाधान को जोड़ सकते हैं। आप उदाहरणों का एक काउंटर लागू करते हैं। यदि यह काउंटर 0 है तो आप मान प्रारंभ करते हैं। लेकिन काउंटर 0 से अधिक कुछ भी नहीं पहुंचता है ...

शायद यह मदद करता है।

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

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