2012-12-23 10 views
11

संभव डुप्लिकेट:
With a private modifier, why can the member in other objects be accessed directly?एक निजी चर एक ही प्रकार के किसी अन्य वस्तु से पहुँचा जा सकता?

एक सी ++ वर्ग की निजी सदस्यों अन्य वर्ग उदाहरणों के लिए अदृश्य हो करने के लिए डिजाइन किए हैं। मैं निजी सदस्यों जिन्हें आप नीचे पहुँचा जा सकता है के बाद से उलझन में हूँ! क्या कोई इसे मुझे समझा सकता है?

एक वर्ग, सभी वर्ग उदाहरणों भर अपने निजी विशेषताओं का उपयोग कर सकते तो कम से कम C++ के
#include <iostream> 
using namespace std; 
class Person 
{ 
private: 
    char* name; 
    int age; 
public: 
    Person(char* nameTemp, int ageTemp) 
    { 
     name = new char[strlen(nameTemp) + 1]; 
     strcpy(name, nameTemp); 
     age = ageTemp; 
    } 
    ~Person() 
    { 
     if(name != NULL) 
     delete[] name; 
     name = NULL; 
    } 
    bool Compare(Person& p) 
    { 
     //p can access the private param: p 
     //this is where confused me 
     if(this->age < p.age) return false; 
     return true; 
    } 
}; 
int main() 
{ 
    Person p("Hello, world!", 23); 
    return 0; 
} 
+7

यह एक प्रति-वर्ग के आधार पर है, प्रति-वस्तु एक एक नहीं। – chris

+1

अपने मुख्य कार्य से p.age एक्सेस करने की कोशिश - कि क्या यह रोकता है, कक्षा के बाहर का उपयोग। – PeterJ

+0

तारों को पकड़ने के लिए std :: स्ट्रिंग का उपयोग करें। वर्तमान में क्योंकि आप नहीं करते हैं कि आप तीन के नियम का पालन नहीं कर रहे हैं (जो एक समस्या है)। –

उत्तर

16

तरीके:

यहाँ मेरी कोड है।

+0

हम्म .. +1 'यह जवाब सही है, लेकिन क्या कोई ऐसा अक्सर करता है? मैं किसी भी समय सोचने के लिए संघर्ष कर रहा हूं कि मुझे ऐसा करने की ज़रूरत है। –

+0

ऑपरेटर को अधिभारित करते समय आपको सबसे अधिक संभावना है, जैसा कि दिए गए उदाहरण में लगभग है। इसके अलावा, मुझे लगता है कि यह एक दुर्लभ उपयोग मामला है। –

4

जब एक चर निजी नामित किया गया है, तो इसका मतलब है कि केवल दोस्तों के रूप में नामित इस वर्ग और वैकल्पिक रूप से कक्षाओं और तरीकों के तरीकों पहुँच सकते हैं। कक्षा का कोई भी उदाहरण एक ही कक्षा के अन्य सभी उदाहरणों के निजी चर का उपयोग कर सकता है।

5

कोड के किसी भी टुकड़ा है कि "अंतर्गत आता है" प्रकार Person के लिए किसी भी Person वस्तु की public, protected और private चर उपयोग करने में सक्षम हो जाएगा।

प्रकार यहाँ मायने रखती है, उदाहरण के लिए नहीं।

1

वर्ग के बाहर किसी भी पहुँच "प्रतिबंधित" है। जब तक आप उदाहरण के लिए मित्र वर्ग का उपयोग नहीं करते हैं।

class MyClass { 
    friend class MyClassB; 
public: 
    MyClass(); 
    ~MyClass(); 
private: 
    int number; 
}; 

फिर MyClassB "MyClass" के निजी चर के लिए उपयोग होगा:

आप इस तरह दोस्त स्तरीय परिभाषित कर सकते हैं (जाने कौन सा वर्ग की निजी सदस्यों के लिए किसी अन्य वर्ग का उपयोग कर सकते है)।

आप कुछ इस तरह करते हैं:

class MyClass { 
public: 
    MyClass(); 
    ~MyClass(); 
private: 
    int number; 
}; 


int main(int argc, char *argv[]) 
{ 
    MyClass A; 
    A.number = 11; // You can't do this 
    if(A.number > 10) { // Either you can't do this. 
     qDebug() << "It's more than 10"; // Qt. well. 
    } 


    return 0; 
} 

आपको एक "त्रुटि" मिल जाएगा क्योंकि आप कक्षा के बाहर से A.number का उपयोग करने की कोशिश कर रहे हैं।

लेकिन तुम वर्ग के अंदर कुछ समारोह से उपयोग करने के लिए चाहते हैं:

class MyClass { 
public: 
    myClass() { 
     number = 10; 
     if(number > 10) { 
      qDebug() << "It's more than 10"; // Qt. well. 
     } 
    } 
    ~MyClass(); 
private: 
    int number; 
}; 
1
if(this->age < p.age) return false; 

p.age: उम्र निजी होती है और इस तरह उपयोग कर सकते हैं क्योंकि इस लाइन की विधि के अंदर है कक्षा, तो यह सभी निजी सदस्य तक पहुंच सकते हैं।

यदि आप कक्षा के बाहर p.age डालते हैं, तो यह त्रुटि दिखाई देगा। उदाहरण के लिए:

int main() 
{ 
    Person p("Hello, world!", 23); 
    // will be error, because main is not inside class People 
    if (p.age < 18) { 
     cout << "You are not adult" << endl; 
    } 
    return 0; 
} 

आशा इस मदद :)

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