2010-06-14 4 views
0

이 같은 클래스가 있습니다일관성

일관성을 위해 모든 연산자를 클래스 외부에 배치해야합니까? 아니면 내부와 외부 절반을 유지해야합니까?

+0

'이중'을 'A'로 처리 할 수 ​​있습니까? 'double'에서'A'로 암시 적 변환이 있습니까? –

+0

@Charles 베일리 - 아니 그것은 할 수 없습니다, 당신은 당신이'두 배'결합 A'와 정확히 같은 구문을 A'와에게''A'를 결합 하시겠습니까 아니,이 경우 – wrongusername

+0

이 없다 '? –

답변

1

을 그래서 당신이 무슨 말을하는지 당신이 클래스 외부에서 일부 사업자 (첫 번째 PARAM으로 A이없는 것)을 넣어해야하기 때문에, 어쩌면 당신은 그 (것)들을 모두 어디에 두어야하는지 그래서 사람들은 그 (것)들을 어디에 찾아내는 지 안다? 나는 그렇게 생각하지 않는다. 가능한 경우 클래스 내부의 연산자를 찾을 것으로 기대합니다. 확실히 "외부"파일을 동일한 파일에 넣어두면 도움이됩니다. 외부 멤버가 private 멤버 변수에 액세스해야하는 경우에는 friend 행을 추가하는 것이 파일에서 해당 연산자를 찾는 데 도움이됩니다.

내 오퍼레이터를 공개 getter 및 setter로 실제로 구현할 수 있다고해도 friend 행을 포함 할 예정입니까? 내 생각 엔. 저는 그 연산자가 실제로 수업의 일부분이라고 생각합니다. 언어 구문에 자유 함수가 필요하다는 것입니다. 그래서 일반적으로 friend을 사용하고 getter 및 setter를 사용하지 않고 멤버 함수였던 것처럼 작성합니다. 결과적으로 friend 문장의 필요성으로 인해 모든 것이 클래스 정의에 나열되는 것은 즐거운 부작용입니다.

+0

질문이 하나 더 있습니다. 게터 또는 설정자를 필요로하지 않는 연산자 함수가있는 경우, 클래스로 채울 수 있습니까? btw, 유익한 답변 주셔서 감사합니다! – wrongusername

+0

'friend'라는 단어가있는 행을 추가하는 것은 연산자를 클래스에 넣지 않고 있습니다. 운영자는 여전히 수업 외부에 있습니다. 운영자가 개인 회원을 직접 사용할 수 있다고 규정하고 있습니다. 클래스 내부에 연산자가 있다는 것을 알리는 부작용이 있습니다. 기술적으로 운영자가 액세스 할 필요가 없더라도 부작용이 'friend'행을 추가 할만큼 유용하다는 것을 알았습니다. –

2

IMHO, 관심사는 문체 일관성이 있으면 안되지만 캡슐 일관성이 있어야합니다. 일반적으로 함수가 전용 멤버에 액세스 할 필요가 없으면 클래스의 일부가 아니어야합니다. 이것은 어렵지 않은 빠른 규칙입니다. 인수는 here입니다.

운영자가 개인 액세스를 필요로하지 않는 경우 외부에 모두 배치하십시오. 그렇지 않으면, 그들은 모두 안쪽과 같이해야 할 것이다 :

class A { 
    ... 
public: 
    ... 
    A operator * (double); 
    A operator/(double); 
    friend A operator * (double, A); 
    friend A operator/(double, A); 
    ... 
}; 
+0

getter 및 setter를 사용하면 개인 액세스가 필요하다고 계산합니까? – wrongusername

+0

게터와 세터의 자유 기능을 어떻게 만들 수 있습니까? :) 어쨌든 개인 액세스 권한을 가진 getter 및 setter가 필요합니다. (예.) – GManNickG

+0

@wrongusername - 공용 클래스 인터페이스 (getter 및 setters 포함)를 사용하여 수행 할 수있는 작업은 개인 구성원 액세스가 필요하지 않은 것으로 간주됩니다. 나는 조심 스러울 것이다. 포괄적 인 getter와 setter는 캡슐화에 반대한다. – academicRobot

2

질문에 대한 답글을 통해 귀하는 double에서 A으로 내재적으로 변환 된 것으로 보입니다. 양쪽이 A 객체와 다른 측면 인 경우

A operator*(const A&, const A&); 

과가 사용됩니다 : 뭔가 같은 :이 경우

class A 
{ 
    // ... 
public: 
    A(double); 

    // ... 
}; 

당신은 단순히 형태의 각 연산자에 대한 무료 함수를 정의 할 수 있습니다 암시 적으로 A으로 변환됩니다. 이러한 이유로 대칭 이진 연산자를 자유롭게 만드는 것이 바람직합니다.

할당 버전 *=의 측면에서 바이너리 *을 자주 구현하는 것이 더 쉽습니다. 이 경우에는 내가 할당 버전 멤버 함수 만들 것과 같은으로 *을 정의 : 클래스 인터페이스의 일부가 분명하다

A operator*(const A& l, const A& r) 
{ 
    A result(l); 
    result += r; 
    return result; 
} 

그렇지 않으면 operator*으로 내가 필요하다면 그것을 friend을 아무 문제가 없을 것입니다.

+0

고마워요! 수업에 참여하는 것은 어떨까요? – wrongusername

+0

@wrongusername :'op *'을 의미합니까? 아무런 이점이 없으며 왼편의 암시 적 변환을 얻지 못할 것입니다. 왜 그렇게 원하십니까? –

+0

내 원래의 질문에 내가 그들을 어쨌든 친구 하지만 지금 당신은 내가'D = (A * B를 같은 약관을 몇 가지 물건을하고 싶지 않을 것이다, 그것을 언급 할거야 만약 내가 내 사업자 회원을할지 여부를했습니다) + c'? – wrongusername