2013-04-30 2 views
0

한다고 가정 우리가이 조건에 : 나는 데이터 멤버에 접근 할 필요가C++ 개인 데이터 멤버 액세스 : 모범 사례

class C { 
    int a, b; 
public: 
    C(int aa, int bb) { 
     setA(aa); 
     setB(bb); 
    } 
    void setA(int aa) { a = aa; } 
    int getA() { return a; } 
    void setB(int bb) { b = bb; } 
    int getB() { return b; } 
    C add(const C c1, const C c2); 
}; 

add()의 경우, 그것을 할 수있는 가장 좋은 방법은 무엇입니까? 나는 클래스 디자이너이기 때문에 액세스 함수 setget (클라이언트 프로그래머 용으로 생성)을 사용하거나 단순히 데이터 멤버 (c1.a, c1.b, c2.a, c2.b)를 사용할 수 있습니까?

+3

'가상'을'추가 '할 계획이십니까? –

+0

생성자에 set 함수를 호출 할 필요가 없습니다. 'a = aa'와'b = bb'을 직접 설정하십시오. – tianz

+0

@ Koushik So. 그가하는 일에는 불법이 없습니다. (3 개의 인수를 취하는'add' 함수 나'const'가 무시되는 문맥에서의'const C'와 같은 의심스러운 몇가지 문제가 있습니다. 또는 모든 멤버들에 대한 getter와 setter를 갖는 것 .) –

답변

5

중 하나를 사용할 수 있습니다. 그것은 당신이 setter/getter를 원하는지 아니면 일부 추가 기능이 필요한지 여부에 달려 있습니다. 예를 들어 getter는 멤버가 액세스 된 횟수를 카운터로 업데이트 할 수 있으므로 클래스 내부에서도 getter를 통해 액세스 할 수 있습니다.

어느 쪽이든, 그것은 디자인에서 가장 중요한 부분이 아닙니다. 먼저 캡슐화가 의미하는 바를 이해해야합니다. 멤버를 private으로 만들고 getters와 setter를 제공하는 것은 처음에 public으로 만드는 것보다 낫습니다 (디버깅 목적으로는 더 낫지 만 개념적으로는 동일합니다).

정말 필요한가요?

또한 getter는 const이어야하며 c1c2const 참조로 전달해야합니다.

+0

'회원들을 ** private **'로 만들고 getter와 setter를 제공하는 것은 처음부터 공개하는 것보다 낫습니다 ...'getter를 사용하지 않고 private 멤버에게 어떻게 접근합니까? 우정? 그러나 우정은'캡슐화 '를 깨뜨린다! 나는 당신이 제시하는이 견해를 이해하지 못합니다. – Mushy

+0

@Mushy 공개 일 경우 직접 액세스 할 수 있습니다. 내 요점은 getters 및 setter와 결합 된 개인 멤버도 캡슐화를 중단한다는 것입니다. –

+0

만약'private'이라면'getters'를 사용하지 않거나'setters'를 사용하지 않고 수정하면 어떻게 접근할까요? '필드 캡슐화'가 멤버를 공개하는 것보다 우정을 배제하는 것보다 낫지 만, 어떻게 액세스 할 수 있습니까? – Mushy

2

그냥 직접 사용하십시오. 설정/가져 오기는 수업 외부의 회원에게 액세스하는 것입니다.

1

add는 클래스의 멤버 함수이므로 private 데이터 멤버에 직접 액세스 할 수 있습니다. 일반적으로 클라이언트 액세스를 위해 set 및 get 함수가 제공됩니다.

1

이 예제에서는 변수 이름을 직접 사용합니다.

하지만 getters/setters가 훨씬 더 많이 사용되는 유사한 상황이 있습니다.

예를 들어

는 세터 (또는 게터) 함수는 단지 사소한 x = y보다 더 복잡 할 때 :

void SetA(int aa){ //a between 0 and 100 
    a = std::max(0, std::min(aa, 100)); 
} 

을 아니면 C를 서브 클래스와 게터/세터 또는 add 함수를 오버로드 할 때.