2011-12-30 8 views
9

मैंने इसे कुछ बार देखा है, और मैं अपने सिर को खरोंच कर रहा हूं कि क्यों ...खाली बाएं हाथ के ऑपरेंड के साथ :: (स्कोप) का उपयोग क्यों किया जाता है?

उदाहरण के रूप में: (http://www.codeguru.com/forum/showthread.php? टी = 377394)

void LeftClick () 
{ 
    INPUT Input={0}; 
    // left down 
    Input.type  = INPUT_MOUSE; 
    Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; 
    ::SendInput(1,&Input,sizeof(INPUT)); 

    // left up 
    ::ZeroMemory(&Input,sizeof(INPUT)); 
    Input.type  = INPUT_MOUSE; 
    Input.mi.dwFlags = MOUSEEVENTF_LEFTUP; 
    ::SendInput(1,&Input,sizeof(INPUT)); 
} 

यह उदाहरण :: (स्कोप) ऑपरेटरों के बिना काम करता है तो वे वहां क्यों हैं?

+0

यह भी यदि '// बाईं down' है काम करता है हटा दिया। तो यह वहाँ क्यों है? विस्तृत जानकारी के लिए। – tenfour

+0

@tenfour वास्तव में नहीं ... –

+0

ओपी मानना ​​सही है कि यह '::' के बिना भी "काम करता है", फिर हां, वास्तव में। लेकिन मुझे लगता है कि इसके लिए और भी कुछ है, और यही कारण है कि मैंने जवाब के रूप में पोस्ट नहीं किया था। – tenfour

उत्तर

22

इसका मूल रूप से अर्थ है "वर्तमान में दृश्यमान की बजाय वैश्विक स्कोप्ड फ़ंक्शन प्राप्त करें"।

void SendInput() { /* (1) */ 
} 

namespace derp { 
    void SendInput() { /* (2) */ 
    } 

    void LeftClick() { 
     ... 
     ::SendInput(); /* matches (1) */ 
     SendInput(); /* matches (2) */ 
    } 
} 
+3

इस मामले में (इसका अर्थ वैश्विक है)। इसका वास्तव में मतलब है "पूर्ण नामस्थान पथ" का उपयोग "रिलेटिव नेमस्पेस पथ" नहीं है। यह इस संदर्भ में और इस प्रकार वैश्विक नामस्थान में एक छोटा रास्ता होता है। –

+0

@ लोकी एस्टारी क्या आप इस अंतर पर विस्तार कर सकते हैं? क्या यह मूल रूप से फ़ाइल के संदर्भ में './path/to/file के बजाय'/path/to/file.txt' के रूप में संदर्भित है।txt' - एक वर्तमान स्थिति के सापेक्ष है, दूसरा एक विशिष्ट स्थान के सापेक्ष है? (इस मामले में, रूट फ़ोल्डर) –

+0

@QPaysTaxes: एक अच्छा एनालॉग। लेकिन आपको एनालॉग को बेहतर बनाने के लिए पैथ चर लागू करने की भी आवश्यकता है। पथ में प्रत्येक निर्देशिका में एक सापेक्ष पथ खोजा जाएगा (जबकि एक पूर्ण नहीं होगा)। सी ++ मामले में पीएटीएच को वर्तमान स्थिति से प्रत्येक नेस्टेड स्कोप द्वारा दर्शाया जाता है। Https://gist.github.com/Loki-Astari/bddbdc98e8c8b9da5edc देखें यह वास्तविक नाम पथ को मूल नामस्थान में नए कोड में जोड़ने के लिए अतिसंवेदनशील बनाता है। –

1

यह वैश्विक दायरे पर प्रतीक को देखने के लिए मजबूर करना है।

void foo() {} // 1 

namespace A 
{ 
    void foo() {} // 2 

    void bar() 
    { 
     foo(); // 2 
     ::foo(); // 1 
    } 
} 
0

इस फैशन में स्कोप ऑपरेटर का उपयोग करना मतलब है कि आप वैश्विक दायरे का जिक्र कर रहे हैं।

मुझे मूल्यवान समय और कीस्ट्रोक बचाने के लिए, scope resolution operator without a scope देखें।

void bar() 
{ 
} 

struct Foo 
{ 
    void bar(); 
}; 

आप सदस्य समारोह Foo::bar आप खाली बाएं हाथ की ओर के साथ सिंटैक्स का उपयोग से वैश्विक समारोह bar कॉल करने के लिए चाहते हैं:

3

कहते हैं कि तुम निम्न होना चलें

void Foo::bar() 
{ 
    // Call the global bar function, not recursively call myself 
    ::bar(); 
} 
0

:: वस्तु के बाहर से किसी ऑब्जेक्ट तक पहुंच प्रदान करने के लिए उपयोग किया जाता है।

2

यह एक पूर्ण नाम संकल्प को मजबूर करता है।
इसके बिना नाम संकल्प वर्ग (ओं)/फ़ंक्शंस नेमस्पेस पथ के सापेक्ष खोजा जाता है।

तो मान LeftClick() नाम स्थान पदानुक्रम में है:

namespace Level1 
{ 
    namespace Level2 
    { 
     namespace Level3 
     { 
      LeftClick() 
      { 
       ::SendInput(); // Absolute path only. SendInput in global namespace 
       SendInput();  // Relative path (Note resolved at compile time) 
            // 
            // Looks for the function here (in this order) 
            // ::Level1::Level2::Level3::SendInput() 
            // ::Level1::Level2::SendInput() 
            // ::Level1::SendInput() 
            // ::SendInput() 
      } 
     } 
    } 
} 

यदि आप एक नेस्टेड नाम है यह और अधिक दिलचस्प हो जाता है:

namespace Level1 
{ 
    namespace Level2 
    { 
     namespace Level3 
     { 
      LeftClick() 
      { 
       ::Test::Action(); // Absolute Path: Function Action() 
            //    in namespace Test 
            //    in global namespace 

       Test::Action(); // Relative Path: Function Action() 
            //    in namespace Test 
            //    in current namespace path. 
            // 
        // It will Look for Test (in this order) 
        // ::Level1::Level2::Level3::Test 
        // ::Level1::Level2::Test 
        // ::Level1::Test 
        // ::Test 
        // 
        // In the first Test (and only the first) it finds it will 
        // try and resolve the Action() function. If it is not there 
        // it is a compile time error. 
      } 
     } 
    } 
} 
संबंधित मुद्दे