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