2014-04-23 6 views
-2

C++은 모든 종류의 두통을주고 있습니다. 다른 클래스의 다른 클래스의 private 멤버에 어떻게 액세스합니까? 아래 예제 코드에서는 멤버에 액세스하려고 시도하지만 다른 클래스의 private 멤버 인 모든 종류의 오류가 계속 발생합니다.다른 클래스의 포인터를 사용하여 클래스의 private 멤버에 액세스

class Ex1 { 
private: 
     int test1; 
}; 

class Ex2 { 
public: 
     Ex2(); 
     void access2Ex(); 
private: 
     Ex1 *pointer_to_Ex1; 
}; 

나는 EX2에서 EX1에 액세스하고 EX2에에 불쾌한 물건을하고 싶은 불쾌한에 의해 난 그냥 만지지을 애무하거나 적어도 EX2의 존재를 인식 할 수 있어야합니다. 누구나 나를 도와 줄 수있어, 고맙겠습니다.

+0

어쨌든 만지고 싶다면 비공개로 설정하십시오 .... – Steve

+0

Ext1 클래스는 완전히 쓸모가 없습니다 - 모든 멤버 비공개이고 친구 클래스/기능이 없습니다. –

+0

Gosh, @ DieterLücking, 어쩌면 그는 질문과 관련된 코드를 삭제했을 것입니다. –

답변

0

클래스의 "개인"구성원 (Java, C++ 또는 "공용"vs "개인"개념의 다른 모든 OO 언어)의 모든 목적은 다른 클래스가 액세스 할 수 없기 때문입니다. 당신이 진정으로 다른 클래스가 액세스 할 수 있도록하려면, 다음 문제의 클래스에 접근 기능/특성 생성 :이

class Ex1{ 
    public: 
    int getTest(){ return test1; } 
    void setTest(int value){ test1 = value; } 
    private: 
    int test1; 
} 

을, 지금 당신은 당신이 프로그래밍과 객체 지향 원칙을 활용할 수있는 좋은 인터페이스를 가지고 .

편집 :

class Ex2{ 
    public: 
    Ex2(); 
    void printIt(){ 
     cout << pointer_to_Ex1->getTest() << endl; 
    } 
} 

그래서 포인터가 가리키는 클래스의 모든 public 메소드를 호출 할 수 있습니다 아래의 답변 언급합니다. 보조 제안 : 포인터를 랩핑하고 Ex1 포인터의 수명을 제어하려면 unique_ptr (표준 라이브러리 참조)을 사용하십시오.

+0

방금 ​​C를 배웠으므로 C++ 개념을 이해하기 어렵습니다. 밀가루 주셔서 감사합니다. – user2816227

+0

@ user2816227 "Gang of Four"책을 읽으십시오. OO 방식으로 간다면 실제로 OO 언어로 된 것들을 밝힐 것입니다. 즉, C++은 마음을 빨리 날려 버릴 수있는 더 많은 방법을 가진 엄격한 언어입니다. 질문 할 의향이 있으면 (때때로 투표기를 다운받는다면) 매우 빨리 배울 것입니다. 행운을 빕니다! – wheaties

+0

이제는 접근 자 기능을 설정 했으므로 Ex2에서 정보를 얻을 수 있습니까? – user2816227

0

@Wheaties 대답은 좋은 것입니다. 그러나 단순히 getset 메서드를 추가하는 대신 클래스의 목적에 의미있는 메서드를 추가하는 것이 좋습니다.

예를 들어, 도서관 용 시스템에서 한 번만 작업했으며 Loan::setDueDate(date) 방법을 사용하는 대신 Loan::renew(date)Loan::recall(date) 개의 방법을 사용했습니다. 처음에는 그들은 같은 일을했습니다 : date_ = date하지만 시간이 지남에 따라 그들은 독립적으로 진화했습니다. 예를 들어, renew(date) 메서드는 renewCount_ 멤버를 증가시킬 수 있습니다. (setRenewCount(count)을 추가하는 것보다 훨씬 좋은 방법이며 호출자가 적절한 경우 두 메서드를 모두 호출해야한다는 것을 기억해야합니다.) 캡슐화는 객체 지향의 중요한 원칙입니다. 그것에주의를 기울이면 프로그램의 신뢰성이 높아집니다. 비공개 멤버에 대한 액세스를 허용하지 않으면 캡슐화 작업을 수행하는 도구입니다. 세터는 도구를 약화시킵니다 (비록 "어디서나"의 멤버에게 직접 액세스하는 것보다 훨씬 낫습니다).

관련 문제