Оператор векторного шаблона C ++ []

Во-первых, я хотел сказать, что это задание HW, и у меня просто есть вопросы относительно ошибок, с которыми я сталкиваюсь

Я сделал векторный шаблон с функцией вставки, которая добавляет data_type в конец динамического массива. Это то, что у меня сейчас.

// Insert the value at the specified index by moving the tail
// when Size = Capacity the Vector has to be reallocated first
// to accomate the new element
void Insert(const DATA_TYPE& value, int index){

// If the Capacity is not large enough then ...
// allocate large vector
if (Size >= Capacity){
// 0. Let's boost the capacity
Capacity += CAPACITY_BOOST;
// 1. Allocate new larger vector
DATA_TYPE* newData = new DATA_TYPE[Capacity];

// 2. Copy from old Data into the newData
for( int i=0; i< Size; i++)
newData[i] = Data[i];

// 3. Delete the old Data
delete[] Data;

// 4. Replace old Data-pointer with the newData pointer
Data = newData;
}

// Move the tail
for(int i=index; i<Size;i++){
Data[i+1] = Data[i];
}

// Insert
Data[index] = value;
Size++;

}
DATA_TYPE& operator[] (int index) const{
return *this[index];
}

Примечание. Использование личных переменных: размер, емкость, данные (сохраняет динамический массив)
Я почти уверен, что правильно реализовал функцию add или push_back. Проблема в том, что когда я пытаюсь что-то наподобие << а [1]; «Я получаю ошибку.

while compiling class template member function 'int &Vector<DATA_TYPE>::operator [](int) const'
with
[
DATA_TYPE=int
]
see reference to class template instantiation 'Vector<DATA_TYPE>' being compiled
with
[
DATA_TYPE=int
]
error C2440: 'return' : cannot convert from 'const Vector<DATA_TYPE>' to 'int &'
with
[
DATA_TYPE=int
]

1

Решение

Там должно быть 2 версии вашего operator[]:

const DATA_TYPE& operator[] (int index) const;
DATA_TYPE& operator[] (int index);

То, что у вас есть, является странной комбинацией двух.

Вы также должны возвращаться

return Data[index];

возврате (*this)[index]; приведет к бесконечному рекурсивному вызову (ну, не бесконечному, вы получите переполнение стека до этого).

5

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

Здесь есть три проблемы:

  1. Приоритет оператора. *this[index] анализируется как *(this[index])в то время как вы имели в виду (*this)[index],
  2. Вы возвращаете изменяемую ссылку на ваши данные из const метод.
  3. Определение operator[] круговой возврате (*this)[index] в operator[] вызовет бесконечную рекурсию.
2

operator[] функция объявлена ​​постоянной, то есть она ничего не может изменить в Vector объект. Но он возвращает ссылку, что означает, что возвращаемое значение Можно быть изменены. Эти два противоречат друг другу.

Это может быть решено либо удалить const с конца функции, или чтобы не возвращать ссылку.

1
По вопросам рекламы [email protected]