vector :: erase с указателем - PullRequest
       49

vector :: erase с указателем

4 голосов
/ 20 апреля 2010

Я манипулирую векторами объектов, которые определены следующим образом:

class Hyp{
public:
int x;
int y;
double wFactor;
double hFactor;
char shapeNum;
double* visibleShape; 
int xmin, xmax, ymin, ymax; 

Hyp(int xx, int yy, double ww, double hh, char s): x(xx), y(yy), wFactor(ww), hFactor(hh), shapeNum(s) {visibleShape=0;shapeNum=-1;};

//Copy constructor necessary for support of vector::push_back() with visibleShape
Hyp(const Hyp &other)
{
    x = other.x;
    y = other.y;
    wFactor = other.wFactor;
    hFactor = other.hFactor;
    shapeNum = other.shapeNum;
    xmin = other.xmin;
    xmax = other.xmax;
    ymin = other.ymin;
    ymax = other.ymax;
    int visShapeSize = (xmax-xmin+1)*(ymax-ymin+1);
    visibleShape = new double[visShapeSize];
    for (int ind=0; ind<visShapeSize; ind++)
    {
        visibleShape[ind] = other.visibleShape[ind];
    }
};

~Hyp(){delete[] visibleShape;};

};

Когда я создаю объект Hyp, выделяю / записываю память в visibleShape и добавляю объект в вектор с помощью vector :: push_back, все работает как положено: данные, указанные в visibleShape, копируются с помощью конструктора копирования.

Но когда я использую vector :: erase для удаления Hyp из вектора, другие элементы перемещаются корректно, ЗА ИСКЛЮЧЕНИЕМ элементов указателя visibleShape, которые теперь указывают на неправильные адреса! Как избежать этой проблемы? Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

Я думаю, вам не хватает перегруженного оператора присвоения для Hyp.

1 голос
/ 20 апреля 2010

Я думаю, что вы можете пропустить оператор присваивания = в классе Hyp.

Hyp& operator = (const Hyp& rhs);

...