2013-06-05 4 views
12

में किसी प्रकार का त्रुटि नाम नहीं है, मुझे नहीं पता कि इसके लिए स्पष्टीकरण खोजने के लिए क्या खोजना है, इसलिए मैं पूछ रहा हूं।
मैं इस कोड है जो त्रुटि की सूचना है:सी ++

struct Settings{ 
    int width; 
    int height; 
} settings; 

settings.width = 800; // 'settings' does not name a type error 
settings.height = 600; // 'settings' does not name a type error 

int main(){ 
    cout << settings.width << " " << settings.height << endl; 

लेकिन अगर मैं मुख्य में मूल्य काम डाल दिया, यह काम करता है:

struct Settings{ 
    int width; 
    int height; 
} settings; 

main() { 
    settings.width = 800; // no error 
    settings.height = 600; // no error 

तुम मुझे बता सकते हैं क्यों?

संपादित करें:
राल्फ Tandetzky के जवाब देने के लिए के बारे में, यहाँ मेरा पूरा struct कोड है। क्या आप मुझे दिखा सकते हैं कि मेरे स्निपेट स्ट्रक्चर के साथ किए गए मानों को कैसे असाइन किया जाए?

struct Settings{ 
    struct Dimensions{ 
     int width; 
     int height; 
    } screen; 

    struct Build_menu:Dimensions{ 
     int border_width; 
    } build_menu; 
} settings; 

उत्तर

24

आप सी ++ में किसी फ़ंक्शन के संदर्भ के बाहर असाइनमेंट नहीं डाल सकते हैं।

int x = 42; // <== THIS IS NOT AN ASSIGNMENT! 

int main() 
{ 
    // ... 
} 

क्योंकि = प्रतीक प्रारंभ के लिए भी इस्तेमाल किया जा सकता है कि: आप तथ्य यह है कि आप कभी कभी = प्रतीक देखा हैरान कर रहे हैं, जैसे एक समारोह के संदर्भ से बाहर इस्तेमाल किया जा रहा। आपके उदाहरण में, आप डेटा सदस्यों को width और height प्रारंभ नहीं कर रहे हैं, आप उन्हें एक मान निर्दिष्ट कर रहे हैं।

+0

वाह ऐसे सूक्ष्म मुद्दे की तरह दिखने वाला है। कभी नहीं देखा था। + 1। यहां केवल एक चीज गायब है सामान्य सामान्य संदर्भ है। क्या आप एंडी या कुछ अन्य लड़के हैं जिन्होंने एंडी के खाते में हैक किया ?:-) –

+1

ओह डॉन, कमाल। मैं भी प्रारंभिकरण का उपयोग कर रहा हूं, इसलिए मुझे समझ में नहीं आया कि यह क्यों काम नहीं करता क्योंकि मेरे पास इस संरचना से पहले कई और चर थे। तो स्पष्ट होना चाहिए। 'int i = 5; 'काम करेगा, लेकिन' int i; 'के बाद' i = 5;' काम नहीं करेगा? – Qwerty

+1

@Qwerty: बिल्कुल –

8

C++ में 11 आप अपने बग को ठीक करने में

struct Settings { 
    int width; 
    int height; 
} settings = { 800, 600 }; 

लिख सकते हैं। त्रुटि प्रकट होती है क्योंकि आप फ़ंक्शन बॉडी के बाहर एक मान असाइन करने का प्रयास कर रहे हैं। आप प्रारंभ कर सकते हैं लेकिन फ़ंक्शन के बाहर वैश्विक डेटा असाइन नहीं कर सकते हैं।

संपादित करें:

अपने संपादित के संबंध में, सिर्फ लिखने

Settings settings = {{800, 600}, {10, 20, 3}}; 

मैं अगर यह विरासत की वजह से हालांकि काम करता है,, 100% यकीन नहीं है। मैं इस मामले में विरासत से बचने और को अपने Build_menu संरचना में सदस्य डेटा के रूप में लिखने की सलाह दूंगा। इस तरह इस्तेमाल होने पर विरासत जल्द ही या बाद में आपको सभी प्रकार की परेशानी देगा। Prefer composition to inheritance. जब आप ऐसा करते हैं, तो यह

Settings settings = {{800, 600}, {{10, 20}, 3}}; 
+0

यह भी 'संरचना सेटिंग्स { int चौड़ाई = 10 लिख सकता है; int ऊंचाई = 20; } सेटिंग्स; ' –

+0

ओह धन्यवाद, इसके बारे में, मेरे पास एक और सवाल होगा। मेरे द्वारा पोस्ट की गई संरचना सिर्फ मेरी असली संरचना का एक स्निपेट था। मैं अपना प्रश्न अपडेट करूंगा, क्या आप बहुत दयालु होंगे और देखें कि मैं इस असाइनमेंटसेट का उपयोग करके इसे कैसे काम कर सकता हूं? मैं अपने main.cpp (पाठ्यक्रम के बाद) की शुरुआत में अपनी संरचना को परिभाषित कर रहा हूं, इसलिए यह मेरे कोड में देखने वाली पहली बात है। यही कारण है कि मैं मुख्य मूल्य() की बजाय 300 वें लाइन पर, इस तरह के वैल्यू असाइनमेंट को पसंद करूंगा। – Qwerty

+0

@ क्वर्टी यह सिर्फ प्रारंभिक है। थीस ने अपनी संरचना को कुछ शुरुआती मूल्य पर सेट किया ताकि आप इन सदस्यों की स्थिति जान सकें। इसके बाद आप इसे प्रोग्राम में accoringly बदल सकते हैं। \ –