2009-05-16 6 views
4

가능한 한 클래스가 아닌 비회원 인터페이스를 만드는 것이 좋습니다. 3D 벡터 클래스의 경우, 'Vector3', 나는 + =, - = 등의 연산자를 클래스 밖으로 옮겨서 생성자와 복사 할당 연산자를 남겨 둘 수 있습니다.클래스에 대한 + = 연산자의 정규형

질문 :이 운영자는 어떤 모습이어야합니까? 다른 연산자를 많이 사용하는 정식 형식을보고 조언을 따라 왔지만 이러한 연산자의 표준 형식을 보지 못했습니다. 나는 그것이 아래 있어야한다고 생각하는 것을 주었다.

두 번째 질문은 다음과 같습니다. 산술 할당 연산자?

class Vector3 { 
public: 
    Vector3& operator+=(const Vector3& rhs); 
    float x, y, z; 
}; 

Vector3& Vector3::operator+=(const Vector3 &rhs) { 
    x += rhs.x; 
    y += rhs.y; 
    z += rhs.z; 

    return *this; 
} 

내가 지금까지 그것을 변경했습니다 무엇 : 전에

(관련) 코드

class Vector3 { 
public: 
    float x, y, z; 
}; 

Vector3& operator+=(Vector3& lhs, const Vector3& rhs) { 
    lhs.x += rhs.x; 
    lhs.y += rhs.y; 
    lhs.z += rhs.z; 

    return lhs; 
} 
+0

: 당신이 다른 사람 전에이 이분 가지고 있기 때문에 그들은 내가 당신의 대답을 받아 들일 것, 충분한 화합물 할당 연산자 –

답변

2

당신은 무엇을 가지고하는 것은 나에게 좋아 보인다.

그러나 연산자 +를 사용하면 + =의 관점에서 구현하는 것이 일반적입니다. (lhs의 복사본을 만든 다음 lhs + = rhs를 호출하고 결과를 반환하십시오)

이 트릭을 이미 알고 있는지 알 수 없지만이 연산자를 구현하는 표준 방법에 대해 염려하고 있습니다. 그것을 언급하는 것은 상처가 될 수 없습니다. :)

+0

페어라고합니다) 내가 알고 있어요,하지만 다른 사람 이것을 읽지 않을 수도 있습니다. 그래서 그것을 언급 해 주셔서 감사합니다! –

0

나는 가능한 한 많은 인터페이스를 말하지 않을 것입니다. operator+=, operator-= 등을 비회원이 아닌 회원으로 만들면 얻을 수있는 것이 많지 않습니다.

어떤 사람들은 개인적인 멤버 변수를 사용하려는 유혹에 저항하기 위해 모든 기능을 비회원이 아닌 친구가하는 기능을 선호합니다. 그러나 당신은 성인입니다 : 공용 멤버로 함수를 작성하고 private 멤버 변수를 사용할 수 없습니다. 함수가 클래스에 묶여 있고 공용 멤버로 지정하면 명시 적으로 처리됩니다. 이외에도

주의 :
는 개인적으로, 내가 대신 대중 접근의 개인 회원을 사용하는 것이 괜찮다 것을 발견 (나는 알고있다 - 나는 지옥에 구울 수 있습니다). 항상 그런 것은 아닙니다! -하지만 자주.
실제로 필요한 경우 몇 분 안에 공용 접근 장치로 전환 할 수없는 경우는 거의 없습니다. 그러나 나는 그것이 대중적인 견해가 아니라는 것을 알고 있으며 사람들에게 그 철학을 따르라고 부탁하지 않습니다.

확실한 기능 및 연산자 "비 친구, 비회원"이되는 구체적인 이유가 있습니다. 예를 들어, "스트림 삽입 연산자"로 사용되는 경우 연산자 < <()을 으로 변경하면 lhs 클래스 (스트림)를 변경해야하므로을 멤버로 만들 수 없습니다.

+0

이 경우 왼쪽 개체의 유형에 대해 변환을 수행하는 것이 유용하기 때문에 실제로는 많은 비 멤버 함수가 실제로 존재하므로 어떤 경우에는 클래스 외부에있는 모든 함수를 분할하지 않고 깔끔하게 정리하는 것처럼 보입니다 회원과 비회원 사이 :) 일반적으로 좋은 조언, 감사합니다. –

+1

나는 동의하지 않는다. 함수 나 연산자가 전용 변수에 액세스 할 필요가 없다면 왜 액세스 할 수 있습니까? 예, 함수를 작성할 때 함수에 액세스하지 않기로 선택할 수는 있지만 나중에 코드를 디버깅 할 때 무엇을 할 수 있습니까? 아니면 수업을 테스트 할까? 우리는 적어도 모든 회원 기능을 검토하여 그들이 사적인 구성원에게 불쾌한 행동을하는지 확인해야합니다. 그래서 옵션이 있다면, + = 연산자를 클래스 밖에서 깨끗하게 유지하는 것이 어떻습니까? 비용은 어디에 있습니까? – jalf

+0

@ jalf : 예, 저는 당신과 함께합니다. 전적으로; 정말로, 나는 약속한다. 나는 그것을 게시하는 것을 망설였다. 그러나 내 친구들이나 동료들에게 충격을 주도록하십시오. 실제로 실용적 일 수 있습니다. 이러한 종류의 운영자는 3- 라이너 인 경향이 있으며,이를 사용하는 클래스는 "가치 유형"인 경향이 있습니다. 그 (것)들의, 그리고 그들은 오히려 사소한 경향이있다. 그렇다면 실제로는 상관 없습니다. 오히려 페이지 더하기 길은 방법에 집중할 것입니다. –

1

당신이 돋보이는 모습.

기본적인 생각은 직관적으로 생각하면 코드를 작성할 때 코드를 어떻게 보이게 할 것인지 생각하는 것입니다. 이 경우에 쓸 수있는 경우

Vector v, w; 

v += w; 
w += v; 

등으로 작성하면 올바른 길을 걷게됩니다.

많은 도움을주는 좋은 방법이 있습니다. 그것에 관한 많은 것들을위한 C++ FAQ에서 this entry을보십시오. 당신이 자신의 이름을 묻는 때문에