Векторный итератор, не dereferencable

Вот пример, вы не можете установить uri для объекта параметров как такового, либо вы используете строку URI / объект URI, либо используете объект параметров для этого типа запроса (см. Node.js http.request документы )

const https = require('https');

const options = {
    hostname: 'jsonplaceholder.typicode.com',
    path: '/todos/1',
};

const req = https.request(options, (res) => {
    let returnData = "";

    res.on('data', chunk => {
        returnData = returnData + chunk;
    });

    res.on('end', () => {
        console.log('returndata: ', returnData);
    });
});

req.on('error', (e) => {
    console.error(e);
});

req.end();

9
задан Poorna 19 November 2008 в 14:04
поделиться

3 ответа

Простой:

  • найдите сбои, так как Ваш недавно созданный Круг не может быть найден в векторе со сравнением Формы *
  • неудавшаяся находка возвращает конечный итератор, который не deferencable, как поймано утверждением Отладки

Чтобы это работало как Вы, хотят, необходимо сравнить Форму, не Форму*

Как указано в других ответах, повышении:: ptr_vector является простым способом достигнуть этого.

12
ответ дан 4 December 2019 в 10:34
поделиться

Это - серьезное основание использовать повышение:: ptr_vector.

Это не только обрабатывает то, что Ваши объекты должны быть уничтожены.
xtofl@: Вы забыли виртуальный деструктор.

Но это также заставляет участников быть похожими на объекты путем возврата ссылок, а не указателей. Это позволяет Вам использовать стандартные алгоритмы намного более естественно вместо того, чтобы играть вокруг с указателями в Вашей 'равной' функции (который является очень ООН C++ как).

#include <boost/ptr_container/ptr_vector.hpp>
#include <iostream>

class Shape
{
    public:
        ~Shape()    {}
        bool operator==(Shape const& rhs) const
        {
            if (typeid(*this) != typeid(rhs))
            {
                return false;
            }

            return this->isEqual(rhs);
        }
    private:
        virtual bool isEqual(Shape const& rhs) const    = 0;
};

class Circle: public Shape
{
    public:
        Circle(int r)
            :radius(r)
        {}
    private:
        virtual bool isEqual(Shape const& r) const
        {
            Circle const&   rhs = dynamic_cast<Circle const&>(r);
            return radius == rhs.radius;
        }
        int radius;
};
class Rectangle: public Shape
{
    public:
        Rectangle(int h,int w)
            :height(h)
            ,width(w)
        {}
    private:
        virtual bool isEqual(Shape const& r) const
        {
            Rectangle   const&  rhs = dynamic_cast<Rectangle const&>(r);
             return (height == rhs.height) && (width == rhs.width);
        }
        int height;
        int width;
};


int main()
{

    boost::ptr_vector<Shape>    data;

    data.push_back(new Circle(5));
    data.push_back(new Circle(6));
    data.push_back(new Rectangle(7,4));

    boost::ptr_vector<Shape>::iterator f;
    f = find(data.begin(),data.end(),Circle(6));

    std::cout << "Find(" << (f - data.begin() ) << ")" << std::endl;


}
2
ответ дан 4 December 2019 в 10:34
поделиться

Как @David Pierre предлагает: находка основана на значении: это смотрит в диапазоне итераторов для указателя (например, 0x0F234420), который равняется указателю на new Circle(point(1,2),3) Вы просто создали. Так как это - новый объект, это не будет там.

Можно обойти это при помощи find_if с оператором, который сравнивает объекты, на которые ссылается с указатель.

Однако Критериум должен смочь дифференцироваться между типами формы.

class Shape {
public:
    //amongst other functions
    virtual bool equal( const Shape* ) const = 0;
};

class Circle : public Shape {
public:
    bool equal( const Shape* pOther ) const {
        const Circle* pOtherCircle = dynamic_cast<const Circle*>( pOther );
        if( pOtherCircle == NULL ) return false;
        // compare circle members
    }
};

class Rectangle : public Shape {
public:
    bool equal( const Shape* pOther ) const {
        const Rectangle* pOtherR = dynamic_cast<const Rectangle*>( pOther );
        if( pOtherR == NULL ) return false;
        // compare rectangle members
    }
};



Shape* pFindThis = new Circle(point(1,2),3);
vector<Shape*>::const_iterator itFound = find_if(s1.begin(),s1.end(), 
    bind1st( mem_fun( &Shape::equal ), pFindThis) ) );
delete pFindThis; //leak resolved by Mark Ransom - tx!

if( itFound != s1.end() ) {
    (*itFound)->move(point(10,20));
}
6
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: