문제

나는 가능한 한 클래스 비회원이 아닌 친구의 인터페이스를 많이 만드는 것이 좋은 생각이라는 것을 알고 있으며, 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;
}
도움이 되었습니까?

해결책

당신이 가진 것이 나에게 잘 어울립니다.

그건 그렇고, 연산자에게 오면 +=로 구현하는 것이 일반적입니다. (LHS 사본을 만들고 LHS += RHS를 호출하고 결과를 반환하십시오).

이 트릭을 이미 알고 있는지 모르겠지만, 이러한 운영자를 구현하는 정식 방법에 대해 걱정하기 때문에 언급하는 것은 아프지 않습니다. :)

다른 팁

당신이 좋아 보인다.

직관적으로 이것에 대해 생각하는 기본 방법은 글을 쓸 때 코드가 원하는 모습에 대해 생각하는 것입니다. 이 경우 쓸 수있는 경우

Vector v, w;

v += w;
w += v;

그리고 당신은 올바른 길을 가고 있습니다.

도움을 줄 좋은 경험 규칙이 많이 있습니다. 보다 이 항목 C ++ FAQ에서 로트에.

나는 "가능한 한 많은 인터페이스"라고 말하지 않을 것입니다. 제작으로 얻을 수있는 것은 많지 않습니다 operator+=, operator-= 친구가 아닌 친구.

어떤 사람들은 모든 기능을 비회원이 아닌 친구 기능으로 개인 구성원 변수를 사용하는 유혹에 저항하는 것을 선호합니다. 그러나 귀하는 성인입니다. 기능을 공개 회원으로 작성하고 개인 회원 변수를 사용하지 않을 수 있습니다. 나는이 기능이 수업에 묶여 있다는 것을 알고 싶어하며 공개 회원으로 만들면 명시 적으로 만듭니다.

제쳐두 : 참고 :
개인적으로, 나는 공개 액세서 대신 개인 회원을 사용하는 것이 종종 괜찮다는 것을 알았습니다 (나는 알고 있습니다 - 나는 지옥에서 불타고 있습니다). 항상! - 그러나 종종.
실제로, 필요하다고 결정하면 몇 분 안에 공개 액세서로 전환 할 수없는 경우가 거의 없습니다. 그러나 나는 그것이 인기있는 견해가 아니라는 것을 알고 있으며 사람들에게 그 철학을 따르라고 요구하지 않습니다.

구체적인 이유가 있습니다 확실한 기능 및 운영자 "비 동정심, 비회원". 예를 들어, Operator << () "스트림 insertion 연산자"로 사용될 때 할 수 없습니다 LHS 클래스 (스트림)를 변경해야하므로 회원이 되십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top