Вам необходимо создать итераторы для своего класса. По умолчанию вы, вероятно, не должны быть уверены, что & arr [i] + 1 безопасен, потому что это было бы ад, чтобы сделать (вместо того, чтобы возвращать значение, вам нужно будет вернуть какой-то специальный класс, содержащий значение, которое имеет какое-то перегрузка для доступа указателя, а затем перегрузка для добавления).
Способ, которым STL управляет безопасностью, позволяет вам получить итератор, используя элемент, такой как arr.at (i), который является классом, который содержит указатель на любой тип данных, но также имеет некоторые дополнительные функциональные возможности что обеспечивает некоторую степень безопасности при манипуляции итератором.
class Array
{
struct Iterator
{
Iterator(Array* array, TYPE* ptr) : m_ptr(ptr) {}
...
Iterator operator +(int i){
if((m_ptr + i) < m_arr->end())
return Iterator(m_arr, m_ptr + i);
}
};
...
Iterator at(unsigned int i) {
if(i < m_size)
return Iterator(this, m_array + i);
}
}
Обратите внимание, что итератор имеет указатель на ваш исходный класс массива. Это необходимо, если вы хотите, чтобы ваши итераторы не выходили за пределы, как вы просили, но итераторы STL не работают таким образом. Вместо этого они заставляют вас проверить, что iterator < array.end()
, чтобы ваши итераторы не знали об их создателях.
Вы должны реализовать это как часть вашего класса «безопасный итератора». –
Вам нужно будет сделать 'operator []' возвращать объект типа класса, который вы можете перегрузить 'operator &'. –
@thecohenoam: Вы будете использовать те же операторы, которые вы использовали бы для необработанных массивов и указателей. Вы можете использовать оператор преобразования для преобразования в нужное значение. Это не идеально, но в основном работает. –