क्या आउट-ऑफ-लाइन सदस्य फ़ंक्शन परिभाषाओं के लिए वैश्विक स्कोप के लिए पूरी तरह से योग्य वर्ग का नाम आवश्यक है?


14

इस प्रश्न ने मुझे आश्चर्यचकित कर दिया कि क्या क्लास के नामों (वैश्विक स्कोप ऑपरेटर सहित) को एक आउट-ऑफ-क्लास सदस्य फ़ंक्शन परिभाषा में पूरी तरह से योग्य बनाने के लिए यह कभी भी उपयोगी / आवश्यक है।

एक ओर, मैंने ऐसा पहले कभी नहीं देखा (और ठीक से ऐसा करने के लिए वाक्यविन्यास अस्पष्ट है)। दूसरी ओर, C ++ नाम देखने में बहुत ही गैर-तुच्छ है, इसलिए शायद एक कोने का मामला मौजूद है।

सवाल:

क्या कभी ऐसा मामला सामने आया है, जिसके द्वारा एक आउट-ऑफ-क्लास सदस्य फ़ंक्शन की परिभाषा
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
को अलग करने से
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }(कोई वैश्विक गुंजाइश ::उपसर्ग न हो)?

ध्यान दें कि सदस्य फ़ंक्शन परिभाषाओं को वर्ग को घेरने वाले एक नामस्थान में रखा जाना चाहिए, इसलिए यह एक वैध उदाहरण नहीं है।


बहुत उत्सुक इस सवाल के बारे में क्या नापसंद है। प्रतिक्रिया का स्वागत!
मैक्स लैंगहॉफ

जब घोषणा से अलग नाम स्थान में परिभाषा रखी जाती है? Thats मैं क्या आप quesiton लिंक के लिए मन में था
idclev 463035818

उफ़, छोटी सी बात नहीं पढ़ी;)
idclev 463035818

@ पूर्ववस्तु_463035818 यह भी वही है जो मेरे मन में था, फिर मैंने कोशिश की और यह महसूस किया कि यह काम नहीं करेगा, इसलिए मैंने सवाल लिखा (दूसरों को भी आश्चर्य होगा)।
मैक्स लैंगहॉफ

जवाबों:


12

एक का उपयोग कर-निर्देश पैदा कर सकता है Fullyयोग्यता के बिना अस्पष्ट होने के लिए।

namespace Foo {
    struct X {
    };
}

using namespace Foo;
struct X {
    void c();
};

void X::c() { } // ambiguous
void ::X::c() { } // OK

5

यह आवश्यक है अगर कोई एक मसोकिस्ट हो और उसे इस तरह से सामान लिखना पसंद हो

namespace foo {
    namespace foo {
        struct bar {
            void baz();
        };
    }

   struct bar {
       void baz();
   };

   void foo::bar::baz() {
   }

   void (::foo::bar::baz)() {
   }
} 

एक निश्चित रूप foo::foo::bar::bazसे वैश्विक दायरे में दूसरा अधिभार लिख सकता है , लेकिन सवाल यह था कि दोनों घोषणाओं का एक अलग अर्थ हो सकता है या नहीं। मैं ऐसे कोड लिखने की सलाह नहीं दूंगा।


हां, यह वास्तव में एक मान्य उत्तर है, और इसकी आवश्यकता भी नहीं है using। विभिन्न मामलों पर प्रकाश डाला अच्छा लगा!
मैक्स लैंगहॉफ

2

यदि एक निर्देश का उपयोग किया जाता है तो एक भ्रामक कोड हो सकता है।

निम्नलिखित प्रदर्शनकारी कार्यक्रम पर विचार करें

#include <iostream>
#include <string>

namespace N1
{
    struct A
    {
        void f() const;
    };      
}

using namespace N1;

void A::f() const { std::cout << "N1::f()\n"; }

struct A
{
    void f() const;
};

void ::A::f() const { std::cout << "::f()\n"; }

int main() 
{
    N1::A().f();
    ::A().f();

    return 0;
}

तो पठनीयता के लिए यह योग्य नाम है

void ::A::f() const { std::cout << "::f()\n"; }

ठीक से दिखाता है कि फ़ंक्शन कहाँ घोषित किया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.