2017-10-06 17 views
0

헤더 파일 (.H) :인스턴스 개체는 함수의 private 멤버를 개체 매개 변수로 어떻게 볼 수 있습니까?

bool canTravelWith(const Passenger&) const; 

구현 파일 (통화 당) :

bool Passenger::canTravelWith(const Passenger& x) const 
    { 
     bool canTravel = false; 

     //if both passengers have the same destination on the same date... 
     if (strcmp(x.m_destination,this->m_destination) == 0 && x.m_year == this->m_year && x.m_month == this->m_month && x.m_day == this->m_day) 
     { 
      canTravel = true; 
     } 

     return canTravel; 
    } 

얘들 아,

작품 위의 코드를하지만 내가 알고 싶어하는 것은 경우입니다 매개 변수의 객체의 멤버는 비공개로 액세스됩니다. 내 canTravelWith() 내에서 해당 객체의 멤버를 어떻게 호출 할 수 있습니까?

다른 경우; 나는 사물의 사적인 구성원을 부를 수 없다.

왜 그런지 이해하고 싶습니다.

감사합니다. (:..

+1

수업의 비공개 회원에게 액세스하는 것이 혼란 스럽습니다. 그게 무슨 문제입니까? –

+1

그럼 왜 승객 클래스에서 승객 클래스에 액세스 할 수 있습니까? 뭐? [좋은 책] (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)을 읽는 것을 고려하십시오. –

답변

1

privateprotected의 정의는 같은 클래스 내 에서 속성이나 기능의 그 종류의 액세스를 제한하지 않는이 모든에 대한 전체 액세스 권한을 갖도록

이는 Passenger 기능 즉 재생중인 객체의 두 인스턴스가 사용자를 제한하지 않습니다. private은 다른 인스턴스가 다른 클래스와 만날 수 있음을 의미하지 않습니다.

0

이는 개인용 멤버가 인스턴스가 아닌 클래스의 개인 멤버이기 때문입니다. .

this의 전용 멤버에 액세스 할 수있는 이유는 무엇입니까? this은 함수에 매개 변수로 전달되었지만 단순히 숨겨져있는 포인터이기 때문에 마찬가지입니다. 당신이 볼 수 있듯이, 우리가 만드는

struct Passenger { 
private: 
    static constexpr int value() { return 42; } 

public: 
    static constexpr int v = value(); 
}; 

: 모든 인스턴스를 필요로하지 않는 private 멤버에 접근, 또한

bool Passenger::canTravelWith(const Passenger& x) const 
{ 
    Passenger const* ptr = this; 

    // ptr is this, of course I can access private stuff! 
    (void) ptr->m_destination; 

    if (rand() % 10) { 
     ptr = &x; 
    } 

    // Is the compiler will really try to guess if ptr 
    // still points to this? privateness is a compile time 
    // property of the class, not runtime. 
    (void) ptr->m_destination; 
} 

:

고려 관점에서이 코드를 저를 넣으려면 자신의 가치가 개인 정적 기능에서 나온 정적 변수. 그러나 우리가 범위에 있기 때문에 우리는 클래스의 범위에 접근 할 수 있습니다.

struct Outer { 
private: 
    int value = 42; 

public: 
    struct Inner { 
     int getPrivate(Outer& o) { return o.value; } 
    }; 
}; 

int main() { 
    Outer o; 
    Outer::Inner i; 

    int v = i.getPrivate(o); 
} 

당신이 볼 수 있듯이, OuterInner 액세스 개인 회원, 친구 인 whithout : 여기에 또 다른 예입니다. 이는 단순히 Inner이 클래스의 범위 안에 있기 때문입니다.