2016-04-07 4 views
1

У меня есть проблема выяснить, использовать оператор [], чтобы присвоить значение, у меня есть 2 разные ошибки,Перегрузка оператора кронштейн назначения

«двоичный„=“: ни один оператор не найден, который принимает правый операнд типа «double» (или нет приемлемого преобразования) »

Оператор« = »не соответствует этим операндам.

Я что-то упустил?

Заголовок

Class CMyVector{ 
public: 
double operator[](const int index) const; 
double & operator[](const int index); 
CMyVector operator+(const CMyVector mv1); 
} 

каст

double CMyVector::operator[](const int index) const 
{ 
    return arr[index]; 
} 

double & CMyVector::operator[](const int index) 
{ 
    return arr[index]; 
} 

CMyVector CMyVector::operator+(const CMyVector mv1) 
{ 
    CMyVector *retval = new CMyVector(); 

    retval[0] = arr[i] + mv1[i]; 

    return *this; 
} 

ответ

2

CMyVector::operator+ кажется странным.

1. retval является указателем, (т.е. CMyVector *), то retval[i] будет CMyVector, который не имеет смысла для retval[i] = arr[i] + mv1[i];. Вы могли бы означать (*retval)[i] = arr[i] + mv1[i];. BTW: Вот утечка памяти, потому что вы не указали указатель delete.

2.You new указатель retval, а затем установить значение на нем, при последнем возврате *this? Это не имеет смысла. Вы могли бы означать:

CMyVector CMyVector::operator+(const CMyVector& mv1) 
{ 
    CMyVector retval; 
    for (int i = 0;i < dim;i++) 
    { 
     retval[i] = arr[i] + mv1[i]; 
    } 
    return retval; 
} 
1

В функции оператора сложения, retval является указатель, который означает, что вы должны разыменования его использовать оператор "инлайн":

(*retval)[i] = ... 

Или вы может вызвать функцию оператора явно с помощью «стрелки» оператора (который делает разыменование для вас):

retval->operator[](i) = ... 

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

См., Например, this operator overloading reference для примера о том, как его реализовать.

2
CMyVector CMyVector::operator+(const CMyVector mv1) 
{ 
    CMyVector *retval = new CMyVector(); 
    for (int i = 0;i < dim;i++) 
    { 
     retval[i] = arr[i] + mv1[i]; 
    } 
    return *this; 
} 

Есть несколько вопросов, с помощью этой функции:

  1. Вы не должны динамически выделять CMyVector для того, чтобы вернуться к значению; который просто утечки памяти и несет ненужные затраты. Это должно быть только CMyVector retval;.

  2. С retval является указателем, retval[i] пытается подстроить его как массив. Вам понадобится (*retval)[i], но поскольку мы избавились от динамического выделения выше, вы можете просто сделать retval[i].

  3. Вы возвращаете *this вместо *retval. Теперь это должно быть return retval;.

  4. Чтобы избежать копирования, вы должны использовать аргумент путем ссылки.

  5. operator+ обычно лучше всего реализуется как функция, не являющаяся членом, так что аргументы обрабатываются симметрично.

Фиксированный код:

CMyVector operator+(const CMyVector& lhs, const CMyVector& rhs) 
{ 
    CMyVector retval; 
    for (int i = 0; i < dim; i++) 
    { 
     retval[i] = lhs[i] + rhs[i]; 
    } 
    return retval; 
} 
+0

Работал как шарм, но я просто использовал * это, как указано в ответе ниже. –

+0

@JoachimGotzes Это совершенно другое значение и не даст вам то, что вы хотите. Обратите внимание, что Joachim удалил этот бит из своего ответа, вероятно, предположил, что вы вместо этого выполняете 'operator + =' или что-то в этом роде. – TartanLlama

+0

Да, вы правы, но я все еще работал, если я заявляю vec = vec2 * 2; У меня есть правильные значения с vec. –

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