2012-06-22 15 views
1

상황에 따라 작동하는 할당 연산자가있는 것 같습니다. 두 개의 float, x 및 y를 포함하는 Vector2 클래스가 있습니다. 여기 운영자 = 방법 : 엔티티위한 onMove 메소드 내C++ 연산자 = 오버로드가 선택적으로 작동합니다.

Vector2 Vector2::operator=(const Vector2 &right) 
{ 
    Vector2 result; 
    result.x = right.x; 
    result.y = right.y; 
    return result; 
} 

I가 가지고 speedFactor 프레임 레이트에 의존 posValid이 지점은 벽에 있는지 여부에 대한 체크이다

Vector2 newPosition = position + (speed * getSpeedFactor()); 

if (posValid(newPosition)) 
{ 
    position.x = newPosition.x; 
    position.y = newPosition.y; 
    //position = newPosition; 
} 

또는 뭔가. 위치와 속도 또한 Vector2입니다. 첫 번째 과제 : 그러나

position = newPosition; 

Vector2 newPosition = position + (speed * getSpeedFactor()); 

작품, 내가 예상/의도 된 동작을 얻을 그대로 코드는 그 자체 또는 전이나 후에 여부에는 영향을주지 않습니다. x & .y 과제. 아닌 반환 형식은 참조이며, 현재 객체에 대한 참조를 반환하는 : 당신의 operator=()

+5

:

당신은 뭔가를해야합니다. 또한 'Vector2'를 반환해야합니다. 또한 객체에서 호출되기 때문에 임시 결과가 아니라 객체를 수정해야합니다. – chris

+0

operator = 일반적으로 자신에 대한 참조를 반환해야합니다. –

+0

이것을보십시오 : http://stackoverflow.com/questions/4421706/operator-overloading – chris

답변

14

은 그렇지 않은 여분의 당신이

Vector2& Vector2::operator=(const Vector2 &right) 
{ 
    x = right.x; 
    y = right.y; 
    return *this; 
} 

를 생성, 현재 개체를 수정해야 잘못 그것의 사본 (또는 귀하의 코드에서와 같은 새로운 사본). 이 기본-구조 + 할당이 아니라이 전화를 복사 구축하기 때문에

Vector2 newPosition = ...; 

위해 일한 이유는.

+3

* "컴파일러가 복사 생성 호출에 기본 구성 + 할당을 최적화했기 때문에"* - 그것은 최적화. '='가 초기화에서 사용될 때, 그것은 할당이 아니며 복사 생성자에 대한 호출이다. –

+0

@BenjaminLindley - thx, 편집 됨. – Attila

1

실제로는 position에 지정하지 않았습니다. 임시 Vector2 개체를 만들고 할당하고 암시 적으로 복사 한 다음 복사본을 반환합니다. 실제 개체를 수정하지 않습니다. NOT ** 할당 연산자, 그것은 생성자입니다 ** 첫 번째는

Vector2& Vector2::operator=(const Vector2 &right) 
{ 
    x = right.x; 
    y = right.y; 
    return *this; 
} 
관련 문제