Мне нужно создать итератор для API, в котором есть только те, которые используются только в стиле «выписывание в указатель». Данный API является OGR; один из рассматриваемых классов - OGRLineString
(для справки: http://www.gdal.org/classOGRLineString.html). Этот класс хранит количество точек, которые могут быть доступны с помощью следующего метода геттер:Создайте корректный итератор для API-интерфейса для записи в указатель
void OGRLineString::getPoint(int pos, OGRPoint *out)
Для того, чтобы использовать аксессор один создает новый объект OGRPoint
и передает указатель на него в методе, который пишет данных к выделенному объекту. Например:
OGRPoint *p = new OGRPoint();
lineString->getPoint(0, p);
Теперь я хотел бы реализовать (STL-подобный) итератор. Даже если я размещаю большие предупреждающие знаки везде, заявляя, что поставляемые OGRPoint
s не подлежат модификации (то есть const
) и не будут обновляться, если другой фрагмент кода изменяет нужный OGRLineString
, я получаю проблему с утечкой памяти с помощью OGRPoint const &operator*() const
, потому что API требует, чтобы я передал специальный экземпляр OGRPoint
, но итератору пришлось бы выделить его. Кроме того, возвращаемый итератором OGRPoint
s не должен удаляться при удалении самого итератора. Кроме того, OGRLineString
не хранит фактические экземпляры OGRPoint
, которые копируются для getPoint
, но простые структуры сохраняют координаты x/y/z; вся необходимая дополнительная информация (например, пространственная ссылка) копируется в аксессуре. Таким образом, простой хост #define private public
не помог бы.
Есть ли разумный/чистый способ добавить итератор без, изменяя исходный источник OGRLineString
? Например, есть ли способ добавить функции к исходному классу или изменить его, как функция Ruby's «Обезьяна-паттинг»? Или посмотрите время жизни контейнера, чтобы очистить экземпляры OGRPoint
, возвращенные итератором?
Вы должны смотреть на то, как 'вектор :: оператор []' работы, которая покажет вам, как решить эту причуду. –
Что вы делаете сейчас, что приводит к утечке памяти? Почему итератор не управляет «OGRPoint»? Что делает ваш итератор? –
Может использоваться OGRPoint со значением-семантикой? т.е. он имеет экземпляр-конструктор и т. д.? В этом случае сделайте это вместо «нового». если нет, используйте smartpointers – sp2danny