2012-02-29 14 views
5

सी ++ का उपयोग करते समय किसी को मुख्य फ़ंक्शन के अंदर एक निजी विशेषता तक पहुंचने की अनुमति नहीं है। उदाहरण:मुख्य विशेषता के अंदर मुख्य विशेषता के पीछे क्या विचार है? जावा एक्स सी ++

#include <iostream> 
using namespace std; 
class Test { 
    private: int a; 
    public: 
     Test(int value) { a = value; } 
     int getValue() { return a; } 
}; 
int main (int argc, char *argv[]) { 
    Test test2(4); 
    cout << test2.a; // Compile error! Test::a is private within this context 
    cout << test2.getValue(); // OK! 
    return 0; 
} 

यह स्पष्ट है क्यों करते समय कोई त्रुटि वर्ग तरीकों के बाहर निजी गुण तक पहुँचने के बाद से सी ++ कक्षाओं के अंदर मुख्य कार्य नहीं है।

हालांकि, जावा में यह अनुमति दी है:

public class Test { 
    private int a; 
    public Test(int value) { a = value; } 
    public int getValue() { return a; } 
    public static void main (String args[]) { 
     Test test1 = new Test(4); 
     System.out.println(test1.a); 
    } 
} 

मैं इस मामले के मुख्य में समझ में टेस्ट वर्ग के अंदर है। हालांकि, मैं इस विचार को समझ नहीं पा रहा हूं कि इसकी अनुमति क्यों है, और कोड के विकास/प्रबंधन में इसका क्या प्रभाव है।

सी ++ सीखते समय, मैंने एक बार सुना "कक्षाओं में मुख्य नहीं होना चाहिए। मुख्य कक्षाओं के उदाहरणों के साथ कार्य करता है या उपयोग करता है"।

क्या कोई इस प्रश्न पर कुछ प्रकाश डाल सकता है?

+0

'मुख्य 'जावा में एक वर्ग के भीतर बहुत ज्यादा रहना है, क्योंकि यह कक्षा के बाहर रहने के लिए अवैध होगा। जावा में कार्यों के लिए कोई वैश्विक दायरा नहीं है। – Dervall

+3

मेरे पास हमेशा एक वर्ग में मुख्य प्रविष्टि बिंदु है जिसमें मुख्य कार्य नहीं है। यह वास्तव में मेरे लिए कक्षा में मुख्य होने का अर्थ नहीं है। – L7ColWinters

+1

अब तक मुझे विश्वास है कि यह भाषा डेवलपर्स का विकल्प था: मुख्य() को अपवाद नहीं करने के लिए, भले ही यह एक विशेष कार्य था, किसी भी अन्य विधि तक पहुंच प्रदान करना। –

उत्तर

6

आप देखने का गलत दृष्टिकोण से इस पर देख रहे हैं।सवाल यह नहीं है कि क्यों मुख्य वर्ग आंतरिक प्रवेश कर सकते हैं। जावा में एक 'मुख्य' नहीं है। इस संबंध में महत्वपूर्ण अंतर यह है कि सी ++ के लिए आवेदन में एक एकल प्रविष्टि बिंदु है जो मुख्य है, जबकि जावा में एक ही एप्लिकेशन में एकाधिक प्रविष्टि अंक हो सकते हैं, जितना प्रति वर्ग एक। प्रवेश बिंदु एक विशेष विधि के साथ एक वर्ग के एक स्थिर विधि (सी ++ शब्दकोष में सदस्य समारोह) होना चाहिए, और व्यवहार एक ही कक्षा के अन्य स्थिर तरीकों के समान ही है।

जावा के एकाधिक प्रविष्टि बिंदुओं का कारण यह है कि आप स्टार्टअप पर वीएम को बताते हैं कि आप (कौन सी कक्षा) में अपना आवेदन शुरू करना चाहते हैं। यह एक ऐसी सुविधा है जो सी ++ (और कई अन्य भाषाओं) में उपलब्ध नहीं है।

+0

धन्यवाद। यह बहुत दिलचस्प है, मैं वास्तव में इस दृष्टिकोण को नहीं देख रहा था। –

5

आप वास्तव में C++ में एक ही कर सकते हैं:

class Test { 
    private: int a; 
    public: 
     Test(int value) { a = value; } 
     int getValue() { return a; } 
     static void Main() 
     { 
      Test t(10); 
      cout << t.a; 
     } 
}; 

ऐसा नहीं है कि के रूप में सरल है: दोनों भाषाओं में, private चर केवल वर्ग के भीतर से सुलभ हैं।

हालांकि, मैं इस विचार को समझ नहीं सकता कि यह क्यों अनुमति है।

यह सिर्फ एक भाषा सुविधा है। यदि आप कक्षा के अंदर से निजी लोगों तक पहुंच नहीं पा रहे थे, तो आप उनके साथ क्या कर सकते हैं?

इसके अलावा, यह नहीं कि पहुंच-स्तर वर्ग-व्यापी हैं, उदाहरण के लिए नहीं। वह आपको फेंक सकता है। इसका मतलब है कि आप एक ही कक्षा के उदाहरण से एक अलग उदाहरण के निजीकरण का उपयोग कर सकते हैं। इसके अलावा, सी ++ में, friend कीवर्ड है जो आपको वही विशेषाधिकार देता है।

+0

लुचैन, मैं इसे समझता हूं, लेकिन इस मामले में यह कार्य कक्षा के अंदर मुख्य उचित नहीं है()। यह कक्षा के बाहर किसी अन्य मुख्य के बिना संकलित नहीं करता है। सही नहीं है? लेकिन जावा में यह संकलित करता है, चलता है, और सबकुछ ठीक है। –

+0

@MoacirPontiJr। हाँ। तथा? 'मुख्य()' सी ++ में प्रवेश बिंदु है, जैसे कि 'MyClass :: main() 'जावा में है। –

2

आपकी अंतर्ज्ञान सही है। दूसरा कोड जावा में मान्य है क्योंकि mainTest कक्षा के अंदर है। यह जो संकलित करने के लिए असफल हो जायेगी एक अलग वर्ग के निजी सदस्य का उपयोग करने की सी ++ कोड कोशिश, के बराबर करने के लिए:

class Test2 { 

    private int a; 
    public Test(int value) { a = value; } 
    public int getValue() { return a; } 

} 

public class Test { 

    public static void main (String args[]) { 
     Test2 test2 = new Test2(4); 
     System.out.println(test2.a); // does not compile 
    } 
} 

वास्तविक अंतर्निहित अंतर यह है कि सी ++ में कार्यों के बाहर कक्षाएं मौजूद कर सकते हैं, में है, जबकि जावा किसी भी विधि को कक्षा का हिस्सा बनने की जरूरत है।

0

यह कारण है: Java पूरी तरह से Object Oriented Programming मॉडल है, इसलिए इसमें किसी भी चीज को कक्षा में कक्षा या छोटी इकाई में परिभाषित किया जाना चाहिए कक्षा है।

+0

* पूरी तरह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग * ... मुझे शुरू न करें, तथ्य यह है कि आप * मजबूर * सबकुछ बनाने के लिए मजबूर हैं इसका मतलब यह नहीं है कि यह * पूरी तरह से * ऑब्जेक्ट उन्मुख है। पाइथन जावा से अधिक ऑब्जेक्ट उन्मुख है जो महत्वपूर्ण है ... –

+0

मैं यहां जावा के साथ पायथन की तुलना नहीं करता हूं। – MJM

+1

मेरा रान उन सभी लोगों के बारे में है जो दावा करते हैं कि जावा 100% ओओ है क्योंकि यह सब कुछ कक्षा में निहित होने के लिए मजबूर करता है, और यह झूठा है। मैं भी (यदि आप चाहते हैं तो पक्ष नहीं) एक ऐसी भाषा का एक उदाहरण प्रदान किया गया है जो जावा से अधिक ओओ है और इसमें ऐसे कार्य हैं जो कक्षाओं के सदस्य नहीं हैं, यह स्पष्ट करने के इरादे से कि दोनों अवधारणाएं वास्तव में समान नहीं हैं। ध्यान दें कि सख्ती से अधिक ओओ उदाहरण प्रदान करके इसे अनुमान लगाया जा सकता है कि जावा 100% ओओ नहीं हो सकता है। –

1

private जावा में "फ़ाइल स्थानीय" सीएफ माना जा सकता है। पैकेज स्थानीय। उदाहरण के लिए आप एक ही बाहरी कक्षा में परिभाषित कक्षा के निजी सदस्यों तक पहुंच सकते हैं।

AFAIK, धारणा है कि आपको स्वयं को उसी फ़ाइल में कोड से बचाने की आवश्यकता नहीं है।

public interface MyApp { 
    class Runner { 
     public static void main(String... args) { 
      // access a private member of another class 
      // in the same file, but not nested. 
      SomeEnum.VALUE1.value = "Hello World"; 
      System.out.println(SomeEnum.VALUE1); 
     } 
    } 

    enum SomeEnum { 
     VALUE1("value1"), 
     VALUE2("value2"), 
     VALUE3("value3"); 
     private String value; 

     SomeEnum(final String value) { 
      this.value = value; 
     } 
     public String toString() { 
      return value; 
     } 
    } 
} 

http://vanillajava.blogspot.com/#!/2012/02/outer-class-local-access.html

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