2011-09-12 7 views
1

I 클래스가 있습니다액세스 개인 회원

class A 
{ 
private: 
ComplexClass member1; 

public: 
getMember1(){return member1;}; 
}; 

을하고 나는 그것을 작동하도록하는 멤버 1을 검색 할 필요가 코드를 단순화 (더 쉽게 이해할 수있는) 것을 구현을 가지고있다. 내 마음에 와서 가장 먼저하는 일이 될 것이다 : 나는 새로운 객체 포인터가 아닌 멤버 1에서 검색 (그리고 컴파일러 경고를 얻을 수) 오전부터 분명히 정확하지

ComplexClass *myComplexClass = &getMember1(); 

myComplexClass.getSomething(); 
myComplexClass.getSomethingElse(); 
etc. 

.

제 질문은 이렇습니다. 이런 일을하는 데 가장 좋은 디자인은 무엇입니까? 캡슐화를 유지하면서도 포인터를 사용하여 멤버의 액세스를 용이하게하려면 어떻게해야합니까? (필자는 member1에서 읽기만하고 쓰기를 원하지 않습니다.)

본인은 클래스 A 내부

ComplexClass *getPointerToMember1() 

을해야 하는가?

+0

'ComplexClass myComplexClass = a.getMember1(); myComplexClass.getSomething();'? –

+0

당신은 아마 시작할 게터를 추가해서는 안됩니다. 외부 엔터티가 멤버 1에게 액세스해야하는 이유는 무엇입니까? 이것이 유일한 엔터티입니까? 그렇다면 친구가 되십시오. –

답변

3

const 참조는 편집을 방해합니다. 제 생각에는 const 포인터보다 당신의 의도가 더 명확합니다. 당신이 만드는 가치로 구성원을 반환하고

class A 
{ 
private: 
ComplexClass member1; 

public: 
const ComplexClass &getMember1(){return member1;}; 
}; 
+1

이것은 잠재적으로 캡슐화가 더 까다로울 수 있음을 의미합니다. 이는 참조 할 'ComplexClass' 객체가 필요하다는 것을 의미하기 때문입니다. (멤버 변수를 유지하지 않고 요청에 따라 'ComplexClass' 객체를 동적으로 생성하는'A'의 향후 구현을 상상해보십시오.) –

+0

Ok. 하지만 나는 그것을 믿는다 : ComplexClass myComplexClass = A.getMember1(); myComplexClass.someInteger = 10; 유효한 구현입니다. –

+0

@Oli 예제를 보면 이미 객체가 생성되어 있습니다. 표현 된 방식으로, 나는 코드가 이미 너무 높게 결합되어 있다고 가정합니다. 이상한 단위 테스트에 유용하다는 것을 알 수있었습니다. –

1

ComplexClass 회원의 복사합니다. 따라서 후속 메서드를 호출 할 때 실제 멤버에서 작업하지 않습니다 (컴파일러에서 무엇을 말하고 있는지).

A::doStuff() 
{ 
    member1.getSomething(); 
    member1.getSomethignElse(); 
} 

class A를 사용하는이 방법은 누구나하지 않은 관리는 구현이 ComplexClass를 사용 :

나는 캡슐화를 유지하는 데 도움이 커플 링을 감소 더 관용적 C++ 접근 방식은 알고리즘 멤버를 만드는 것입니다 생각 대신에 그들은 어떤 일을하기 위해 A을 말할 수 있다는 것을 알고 있으며 최선의 방법으로 끝낼 것입니다.

주석 편집 :이 경우 ComplexClass (구현을 숨기기 위해)에서 값을 가져 오는 A에 메소드를 만드는 것이 좋습니다. 이것이 적합하지 않다면 const 참조로 구현을 반환 할 수 있습니다. const ComplexClass& getMember1() const { return member1; }

+0

그래, 좋은 방법 일텐데,이 경우에는 유효한 옵션이 아니야. 필자가 작성한 것처럼 member1에서 데이터에 액세스하고 작업을 구현하지 않겠습니다. –

관련 문제