2015-05-17 2 views
1

Я пытаюсь перегрузить оператор + = для классов gridCoord и гендир в следующем коде:+ = оператор перегрузки

struct gridCoord{ 
    unsigned x; 
    unsigned y; 
} 

inline gridCoord operator +(const gridCoord l,const genDir& r){ 
// This operator is tested and works 
} 

inline void operator += (gridCoord l,const genDir& r){ 
    l = l+r; 
    std::cout<<l; 
} 

Оператор работ +, однако, когда я запускаю код ниже:

int main(){ 

gridCoord coord(1,0); 
genDir gd; 

coord += gd; 
std::cout<< coord; 

std::cin.get(); 
return 0; 
} 

я получить выход

x: 2 y: 0 
x: 1 y: 0 

Я ожидал бы

x: 2 y: 0 
x: 2 y: 0 

Если бы он работал. Кажется, что установленный оператор + = фактически не изменяет левый аргумент, как предполагается. Есть идеи, почему это так? Благодаря!

+3

Вы знаете, почему 'ничтожной F (интермедиат а) {а = 1; } int main() {int x = 0; F (X); cout << x; } 'выходы 0? То же самое. – molbdnilo

+1

В настоящее время все так одержимы «genDir». –

ответ

5

Чтобы изменить l вам нужно передать его по ссылке:

inline void operator += (gridCoord& l,const genDir& r){ 
           //^

В противном случае вы только модифицируя копию переданного gridCoord параметра.

3

Есть две основные проблемы.

Для стартера вы принимаете аргумент левой стороны по значению, что означает, что внутри operator+=, l - это просто копия; поэтому любые изменения, которые вы собираетесь выполнить на этом l, не будут отражены в исходном аргументе, на который вы назовете operator+=.

Во-вторых, operator+= должен вернуть T&, что должно быть ссылкой на измененный объект, чтобы обеспечить цепочки.

Если вы положили их вместе вы получите что-то вдоль линий:

inline gridCoord& operator+=(gridCoord& lhs, genDir const& rhs){ 
    return lhs = lhs + rhs; 
} 
+0

@LightnessRacesinOrbit Да, спасибо. – Shoe

Смежные вопросы