약간 비대칭 적으로 추가 된 클래스를 만들고 있습니다. 불만이 오기 전에 반드시 비대칭입니다. 두 개체가 함께 추가 될 때 발생하는 변환 (시간이 조금 걸리는 작업)이 있으며 변환은 가장 자연스럽게 오른쪽 summand와 관련하여 발생합니다. C++에서 연산자 결합 성을 오버로드 할 수 있습니까?
추가 할 두Foo
의 위해서는 ... 여기에 무슨 일이 일어나고 있는지의 일반적인 예입니다,
class Foo {
char _fav;
int _prop;
public:
const char fav() const {return _fav;}
const int prop() const (return _prop;}
void changeFav(char); // complicated method that also changes _prop
void changeProp(int); // straightforward method
}
Foo
operator + (Foo A, Foo B) {
Foo sum;
if (A.fav() != B.fav()) A.changeFav(B.fav);
sum.changeProp(A.prop() + B.prop());
return sum;
}
을이 콘크리트를 만들기 위해, 그들은 그렇게 선택의 여지가 있어야합니다, 같은 _fav
이 필요합니다 어느 것으로 변환 할 것인가. Foo
의 세부 정보를 기반으로 왼쪽 summand를 오른쪽 summand와 일치하도록 변경하는 것이 가장 자연스러운 것입니다.
, 일 : 이미 C
같은 _fav
은 다음 changeFav
이 D
두 번 호출이
Foo A,B,C;
Foo D = A + B + C; // D = (A + B) + C
Foo E = A + (B + C);
A
경우 (한 번 B._fav
에 A._fav
변경 한 후 다시 C._fav
에 (A+B)._fav
을 변경) 및 E
(B._fav
에서 C._fav
으로 변경)에 한 번 후자를 선호하지만 사용자가 여러 추가를 위해 괄호를 사용하지 않도록하고 싶습니다.
이런 일이 발생하도록 operator +
의 결합성에 과부하가 걸릴 수 있습니까?
'연산자 +'는 아무 것도 반환하지 않으며 두 개의 멤버 함수에 반환 유형이 없습니다. –
완전한 대답을 제공 할 수는 없지만 간단히 말해서 foo를 반환하지 말고 오른쪽 피연산자를 foo가 아닌 다른 것으로 만드십시오. 이것은 내 혼에서 입력 한 의식의 흐름입니다. –
@LightnessRacesinOrbit 네, 이것은 단지 잘못된 예일 뿐이므로 어떤 일이 벌어지고 있는지 볼 수 있습니다. 실제 코드가 아닙니다. – PengOne