2013-03-05 3 views
-1

Я хотел бы перегружать оператор «+» для struct, но я получаю предупреждение компилятора Вот моя попытка:Как правильно перегрузить оператор «+» для структуры

предупреждение
struct wektor{ 
    int x; 
    int y=0;  
    int norm(){ 
     return x*x+y*y; 
    } 
}; 

wektor& operator +(wektor &a,wektor &b){ 
    wektor c; 
    c.x=a.x+b.x; // 12 line - warning here 
    c.y=a.y+b.y; 
    return c; 
}; 

Компилятор:

[Внимание] нестатические инициализаторы элемента данных, доступные только с -std = C++ 11 или -std = ГНУ ++ 11 [по умолчанию включено] в 12 линии

+0

is struct 'wektor {' line 0? –

+1

Почему вы не читаете сообщение об ошибке? – Geoffroy

+0

Должен ли 'wektor' быть''''? И почему 'norm()' вычисляет величину квадрата вместо того, чтобы иметь какое-либо отношение к нормализации? –

ответ

4

Прежде всего, двоичный оператор + должен возвращать новое значение, а не ссылку. А если реализуется в терминах ссылок в качестве входных данных, то они должны быть константной:

wektor operator +(const wektor &a, const wektor &b); 

Во-вторых, предупреждение об этой инициализации:

struct wektor{ 
    int x; 
    int y=0; // HERE! C++11 only 
    int norm(){ 
     return x*x+y*y; 
    } 
}; 

Вы можете сделать это только в C++ 11. Вы можете использовать конструктор в C++ 03.

struct wektor{ 
    wector() : y() {} // zero-initializes y 
    int x; 
    int y; 
    int norm(){ return x*x+y*y;} 
}; 

Возвращаясь к operator+, я бы реализовать элемент operator+=, а затем использовать его в не-члена operator+:

wektor operator +(wektor a, const wektor &b) 
{ 
    return a+= b; 
} 

С другой стороны, дать wector конструктор два параметра для x и y :

wector(int x, int y) : x(x), y(y) {} 

муравей затем

wektor operator + (const wektor& a, const wektor &b) 
{ 
    return wector(a.x + b.x, a.y + b.y); 
} 
+0

ваш ответ очень хороший, не могли бы вы рассказать мне, как перегружать '+', чтобы проверить работу 'w + 5', где' w' является 'wektor'? – Qbik

+1

@Qbik либо предоставляет 'wector operator +', который принимает аргументы 'wector' и' int' (но тогда '5 + w' не будет работать) или предоставить (неявный) конструктор преобразования для' wector', который принимает параметр 'int':' wector (int x): x (x), y (0) {} '. – juanchopanza

8

предупреждение говорит вам о линии:

int y=0; 

Вы не можете иметь Инициализатор на нестатическом неконстантный члене до C++ 11. Если вы хотите инициализировать y на 0, вам необходимо предоставить конструктор для wektor с номером инициализации члена.

Тем не менее, параметры вашего operator+ должны быть типа const wektor&. Он также должен возвращаться по значению, потому что на данный момент вы возвращаете ссылку на локальный объект, который будет уничтожен в конце функции, и это плохо. Это должно выглядеть так:

wektor operator +(const wektor &a, const wektor &b){ 
    wektor c; 
    c.x=a.x+b.x; // 12 line - warning here 
    c.y=a.y+b.y; 
    return c; 
}; 
+0

без 'y = 0' У меня есть:« [Warning] ссылка на местный переменная 'c' возвращена [включена по умолчанию] " – Qbik

+2

@Qbik делает оба изменения - это и не возвращается по ссылке. –

+1

@Qbik Вы не должны возвращать ссылку на локальную переменную. Локальная переменная выходит за пределы области действия и уничтожается. Итак, ссылка остается болтающейся. –

2

Не так. Подпись должна быть

wektor operator +(const wektor &a, const wektor &b) 

I.e. не возвращайтесь по ссылке от оператора + и, что еще более важно, не возвращайте временную ссылку.

1

Это предупреждение о том, что вы используете функцию C++ 11, которая недоступна в предыдущих стандартах C++.

Когда вы знаете, что вы запрограммировали работает так, как вы думаете, вы можете избавиться от этой ошибки, выполнив:

Если вы используете CodeBlocks:

  1. Щелкните правой кнопкой мыши "Строить Options ..."
  2. Выберите вкладку "Другие параметры"
  3. Добавить "-std = гну ++ 11"

Если вы используете командную строку: Добавьте «-std = gnu ++ 11» в команду arg.

+1

C++ 11 * - * стандарт C++. – juanchopanza

+0

Действительно? Weeeeeird. Почему они беспокоятся о предупреждении? Зачем вам нужно включить «C++ 11»? –

+0

В g ++, '-std = C++ 0x' для версий старше 4.7 и' -std = C++ 11' с тех пор ('-std = C++ 0x' тоже работает). Для других компиляторов я не знаю. – juanchopanza