К сожалению, во многих встроенных системах мы не можем использовать класс std::vector, потому что он использует свободную память. Мы можем решить эту проблему, либо предложив особую реализацию класса vector, либо (что более просто) используя контейнер, напоминающий класса vector, но не содержащий его механизма управления памятью.
Прежде чем описать такой интерфейсный класс, перечислим его желательные свойства.
• Он ссылается на объекты в памяти (он не владеет объектами, не размещает 0 их, не удаляет и т. д.).
• Он знает свой размер (а значит, способен проверять выход за пределы допустимого диапазона).
• Он знает точный тип своих элементов (а значит, не может порождать ошибки, связанные с типами).
• Его несложно передать (скопировать) как пару (указатель, счетчик).
• Его нельзя неявно преобразовать в указатель.
• Он позволяет легко выделить поддиапазон в целом диапазоне.
• Его легко использовать как встроенный массив.
Свойство “легко использовать как встроенный массив” можно обеспечить лишь
приблизительно. Если бы мы сделали это совершенно точно, то вынуждены были
бы смириться с ошибками, которых стремимся избежать.
Рассмотрим пример такого класса.
template class Array_ref {
public:
Array_ref(T* pp, int s) :p(pp), sz(s) { }
T& operator[ ](int n) { return p[n]; }
const T& operator[ ](int n) const { return p[n]; }
bool assign(Array_ref a)
{
if (a.sz!=sz) return false;
for (int i=0; i
return true;
}
void reset(Array_ref a) { reset(a.p,a.sz); } void reset(T* pp, int s) { p=pp; sz=s; }
int size() const { return sz; }
// операции копирования по умолчанию:
// класс Array_ref не владеет никакими ресурсами // класс Array_ref имеет семантику ссылки private:
T* p; int sz;
};
Опубликовал katy
April 26 2015 07:29:21 ·
0 Комментариев ·
2677 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.