2017-01-09 1 views
-4

Q - как этот оператор = что он будет работать:operator = bout side one by value second by refrence?

int t = v [3]; // ее i возвращает значение

v [3] = 8; // ей я должен вернуться к refrence (указатель на V [3] добавить ')

воля V является вектор класса (шаблон класса в моем случае)

template <class T> 
T& Vector<T>::operator[](const int Index) const 
{ 
    if(Index > -1 && Index < this->Size) 
    { 
    return &this->Array[Index]; 
    } 
else 
    { 
     cerr <<"VECTOR_INVALID_INDEX"<<endl; 
     return NULL; 
    } 
}; 
+0

И .. В чем же проблема с кодом, который вы опубликовали? Является ли это ошибкой компиляции на 'return NULL;'? Примечание: ссылки не могут быть равны 'NULL'. –

+2

Типичным способом обработки этого является использование константы и неконстантной перегрузки оператора []: 'const T & Vector :: operator [] (const int Index) const;' 'T & Vector :: operator [] (const int Index); '. Вам не нужно возвращать стоимость; новая переменная типа 'int t' сможет связываться как с ссылочными, так и с возвращаемыми значениями ссылки на константу. – 0x5453

+1

Ссылки не являются указателями, и наоборот. Нет такой вещи, как нулевая ссылка. – molbdnilo

ответ

0

Есть несколько ошибок в этом примере , this уже указатель. Выполнение &this почти наверняка не то, что вы хотели сделать здесь. Другая проблема, с которой вы сталкиваетесь, заключается в том, что вы возвращаете ссылку на T, но this является константой в этом контексте. this->Array[Index] - const T, который не может связываться с T&. Добавьте вместо этого константу и ответьте const T&. В-третьих, this->Size не вызывает метод Size, вы забыли скобки. Четвертая проблема - ссылка на NULL. Вам придется решить другой подход. Обычный способ указать, что операция не может быть завершена, - это выбросить исключение. std::vector::at throws std::out_of_range из заголовка stdexcept.

template <class T> 
const T& Vector<T>::operator[](const int Index) const 
//^^^ add const here 
{ 
    if (Index > -1 && Index < this->Size()) 
    //     Add parentheses ^^ 
    { 
     return this->Array[Index]; 
     // ^No need for & 
    } 
    else 
    { 
     throw std::out_of_range("VECTOR_INVALID_INDEX"); 
    } 
}; 

Вы, вероятно, хотите добавить неконстантную версию, а также, так как это будет не в состоянии на примере v[3] = 8;. Определите этот метод также с тем же самым телом:

T& Vector<T>::operator[](const int Index); 
+0

Перегрузка оператора _fixed_, все еще имеет ошибки компиляции: 'return NULL;' из метода, который возвращает ссылку. –

+0

return null - это число, равное -1 или больше, чем стек, который он знает assinmant, спасибо !!!! –

+0

как это работает: T \t operator = (const T * Element); , что два оператора работают бой? –