неверная инициализация неконстантной ссылки

Хорошо, я пытаюсь выяснить эту ошибку и до сих пор не повезло. Я делаю это для домашней работы, поэтому я не использую включенные классы.

Вот соответствующий код:

//Will return an array where each element is the sum of the respective sums in the added         arrays
Vec& Vec::operator+(Vec& v2) const{
Vec ret();
if(mySize>0){
Vec ret(mySize);
for(unsigned i = 0;i<mySize;i++){
ret[i]=v2[i]+myArray[i];
}
}
else{
}
return ret;
}

И из файла .h …:

Vec& operator+ (Vec& v2) const;

Это выдает ошибку: «неверная инициализация неконстантной ссылки типа‘ Vec&’Из значения типа« Vec (*) () »« Я совершенно новичок в C ++, поэтому любая помощь будет принята с благодарностью.

0

Решение

Vec ret();

Принимается как прямое объявление функции, которая не принимает аргументов и возвращает Vec, Увидеть: самый неприятный разбор.

Затем вы возвращаете ссылку на локальную переменную, что плохо. ret выходит из области видимости, как только функция возвращается.

7

Другие решения

Фактическая ошибка заключается в том, что вы объявляете функцию внутри вашего оператора, а не объявляете Vec объект.

Vec ret();

Вы можете исправить это, опустив ():

Vec ret;

Кроме того, у вас есть фундаментальная ошибка проектирования, когда вы пытаетесь вернуть ссылку на переменную, которая является локальной для области действия вашего оператора, что приводит к зависанию ссылки. Обычный способ выражения оператора сложения состоит в том, чтобы он возвращал новый объект и обычно реализуется как функция, не являющаяся членом, с такой сигнатурой, как

Vec operator+(const Vec& lhs, const Vec& rhs);

Это может быть реализовано в терминах оператора члена приращения

Vec& operator+=(const Vec& rhs);

Этот может вернуть ссылку на this следовательно, нет висящей ссылки. Пример реализации od operator+ будет тогда

Vec operator+(Vec lhs, const Vec& rhs)
{
return lhs += rhs;
}
3

Как и другие заявили ваше первоначальное заявление ret который вы считаете построением по умолчанию Vec на самом деле вперед delcaring функция, которая не принимает аргументов и возвращает Vec, Ака то самый неприятный разбор.

Так же переменное затенение ‘ret’ внутри оператора if означает, что вы не изменяете переменную, которую ожидаете вернуть. Вполне вероятно, что вы хотите что-то более похожее на это:

Vec Vec::operator+(const Vec& v2) const{
Vec ret(mySize);
if(mySize>0){
for(unsigned i = 0;i<mySize;i++){
ret[i]=v2[i]+myArray[i];
}
}
else{
}
return ret;
}
0
По вопросам рекламы [email protected]