के साथ '::' की जगह लेगा। 'C ++ में अस्पष्टता बनाएँ?


95

C ++ में, ऑपरेटर ::का उपयोग एक नाम स्थान या वर्ग में वर्गों, कार्यों और चर तक पहुंचने के लिए किया जाता है।

अगर उन मामलों के .बजाय भाषा विनिर्देश का उपयोग किया जाता है ::, जैसे कि किसी वस्तु के उदाहरण चर / तरीकों तक पहुँचने पर तो क्या इससे संभावित अस्पष्टताएं पैदा होंगी जो कि मौजूद नहीं हैं ::?

यह देखते हुए कि C ++ ऐसे चर नामों की अनुमति नहीं देता है जो एक प्रकार का नाम भी हैं, मैं उस मामले के बारे में नहीं सोच सकता जहां यह हो सकता है।

स्पष्टता: मैं यह नहीं पूछ रहा कि क्यों ::चुना गया था ., अगर यह भी काम कर सकता था?


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
शमूएल ल्यू

जवाबों:


124

C ++ को मौजूदा C कोड (जो ऑब्जेक्ट नामों और स्ट्रक्चर टैग के बीच नाम टकराव की अनुमति देता है) के साथ संगत बनाने के प्रयासों के कारण, C ++ वर्ग के नामों और ऑब्जेक्ट नामों के बीच नाम टकराव की अनुमति देता है।

जिसका मतलब है कि:

struct data {
    static int member;
};

struct data2 {
    int member;
};

void f(data2& data) {
    data.member = data::member;
}

वैध कोड है।


11
तो शीर्षक में सवाल का जवाब हां है, यह होगा , है ना?
एनरिको मारिया डे एंजेलिस

2
@EnricoMariaDeAngelis यह इतना आसान नहीं है। C ++ जावा या C # की तरह पूरी तरह से नई भाषा के रूप में विकसित हुई, अस्पष्टता शायद टाला जा सकता है । लेकिन C ++ को "C with classes" के रूप में विकसित किया गया था, और इसीलिए यह नहीं है। "हाँ, यह होगा " एक सही उत्तर है, लेकिन एक अलग प्रश्न के लिए।
किट।

प्रतीक्षा, असाइनमेंट लाइन बस दिखाया जा रहा है नहीं कि डालने .या ::एक ही दो "शब्दों" के बीच अलग-अलग प्रभाव पड़ता है ( data.memberको संदर्भित करता है memberके dataवर्ग की वस्तु data2है, जबकि data::memberकरने के लिए संदर्भित करता है memberवर्ग के data)?
एनरिको मारिया डे एंजेलिस

1
हां, लेकिन यह ऐसा कुछ नहीं है जिस पर भाषा डिजाइनरों को गर्व होना चाहिए। यह संगतता निर्णयों की सिर्फ एक कलाकृति है।
किट।

ठीक है, मैं समझता हूं कि C ++ आज कैसा है और अब तक (यह भी) इस बात पर निर्भर करता है कि C ++ उस समय क्या विकसित हुआ था। लेकिन सी ++ की बात कर रहे हैं और यह है कि क्यों यह है के रूप में एक तरफ छोड़कर, वहाँ एक अस्पष्टता होगी अगर सभी ::को बदल दिया गया था .। एक तरह से आपने पहले ही हां का जवाब दिया । मैं केवल आपको पहली टिप्पणी में भंग नहीं कर सकता। हो सकता है मेरा स्तर उस टिप्पणी को मेरे लिए धुँआदार बना दे।
एनरिको मारिया डे एंजेलिस

37

एक उदाहरण जहां दोनों मान्य हैं, लेकिन विभिन्न वस्तुओं को देखें:

#include <iostream>

struct A {
    int i;
};

struct B {
    int i;
    A B;
};

int main() {
    B x {0, 1};
    std::cout << x.B.i << '\n';
    std::cout << x.B::i << '\n';
}

कोलिरु पर लाइव देखें ।


और यह आसानी से विभिन्न डिजाइन निर्णयों के साथ हल नहीं किया जा सकता है!
15:25 पर user253751

7

के बीच अंतर है a::bऔर a.bजहां ::इसका मतलब है कि aनाम स्थान के रूप में उपयोग किया जाता है, जिसका अर्थ है कि यह नाम स्थान या टाइपनेम है। बशर्ते कि C ++ गैर-आभासी बहुवचन वंशानुक्रम का समर्थन करता है और एक चर का एक प्रकार के रूप में एक ही नाम हो सकता है, यह गलत ऑब्जेक्ट को संदर्भित करने की संभावना को स्ट्रिप्स करता है। यह टेम्पलेट मेटाप्रोग्रामिंग के लिए आवश्यक है।

एक और उदाहरण वर्ग बी के संदर्भ में &B::fooबनाम होगा &B.foo


2

@Deduplicator उदाहरण का विस्तार करें:

#include <iostream>

struct A {
    int i;
};

struct B : public A {
    int i;
    A A;
};

int main() {
    B x {1, 2};
    std::cout << x.i << '\n';
    std::cout << x.B::i << '\n';  // The same as the line above.
    std::cout << x.A.i << '\n';
    std::cout << x.A::i << '\n';  // Not the same as the line above.
}

कोलिरु दर्शक पर लाइव

:: की मदद से अंतर करने की संभावना नहीं होने पर, हम किस सदस्य तक पहुंचना चाहते हैं, समान नामों के साथ मूल श्रेणी में घोषित सदस्यों तक पहुंचना असंभव है।


A A(चर नाम जो एक प्रकार का नाम भी है) हालांकि C ++ में मान्य नहीं है, इसलिए यह उदाहरण अभी के लिए काम नहीं करता है
जिमी आरटी

1
@ JimmyR.T। कोलीरू व्यूअर पर कामकाजी जीवन उदाहरण है। कृपया अपने कथन की पुष्टि मानक से एक पैराग्राफ के साथ करें।
एसएम

अगर कोई शापित विरासत वाले हीरे को दूसरी जगह एक ही चीज़ के साथ जोड़ देगा, तो यह C ++ में संभवत: नामकरण सिज़ोफ्रेनिया का एक शिखर होगा
स्विफ्ट - शुक्रवार पाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.