Методы переопределения C++

Один из лучших инструментов использует эти Средства отладки для Windows и берет дамп памяти процесса с помощью adplus, затем используйте windbg и плагин sos для анализа памяти процесса, потоков и стеков вызовов.

можно использовать этот метод для идентификации проблем на серверах также, после установки инструментов, совместно использовать каталог, затем соединиться с долей от использования сервера (сетевое использование) и или взять катастрофический отказ или подвесить дамп процесса.

Тогда анализируют офлайн.

7
задан Joseph Mansfield 4 August 2009 в 21:53
поделиться

5 ответов

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

У вас есть конкретный класс Polygon , производный от другого конкретного класса ] Сущность . Ваши функции addEntity и getEntity принимают и возвращают Entity по значению , поэтому, если вы попытаетесь передать или получить Entity , вы скопируете только Entity ] части этого объекта (разрезая его), и информация о производной части объекта будет потеряна.

Кроме того, у вас есть вектор из Entity , который является вектор объектов базового класса, поэтому у вас нет возможности сохранить что-либо, кроме базового типа объекта.

Если вам нужна коллекция объектов смешанного типа, но все они производные от Entity , вам может потребоваться использовать динамически создаваемые объекты и какой-то интеллектуальный указатель, такой как tr1 :: shared_ptr или boost :: shared_ptr .

Например

class Scene {
    private:
        // -- PRIVATE DATA ------
        vector< std::tr1::shared_ptr<Entity> > entityList;
    public:
        // -- STRUCTORS ---------
        Scene();
        // -- PUBLIC METHODS ----
        void addEntity( const std::tr1::shared_ptr<Entity>& ); // Add entity to list
        const std::tr1::shared_ptr<Entity> getEntity(int); // Get entity from list
        int entityCount();
};

Edit

] Ваш обновленный код вызова в основном правильный, хотя использование локальной константной ссылки на общий указатель немного неясно.

Я бы, вероятно, выбрал что-то вроде:

std::tr1::shared_ptr<Polygon> poly( new Polygon );
poly->addVertex(Point2D(100,100));
poly->addVertex(Point2D(100,200));
poly->addVertex(Point2D(200,200));
poly->addVertex(Point2D(200,100));
scene->addEntity(poly);
14
ответ дан 6 December 2019 в 12:53
поделиться

Комментарий холлиды правильный: вы нажимаете объект типа Polygon в область памяти, предназначенную для типов Entity, и запускается в так называемое срезание . Дополнительная информация «Многоугольник» удаляется, и все, что у вас остается, - это сущность.

1
ответ дан 6 December 2019 в 12:53
поделиться

Для этого вам следует использовать чистую виртуальную функцию.

class Entity
{
public:
    virtual void draw() = 0;
};

Затем вызовите функцию рисования из вашего объекта, и вы также должны использовать указатели на свои объекты.

1
ответ дан 6 December 2019 в 12:53
поделиться

Вы должны в первую очередь хранить указатели (предпочтительно умные указатели :)) на экземпляры Entity. Вектор перераспределяется при вставке, поэтому ваши объекты нарезаются еще до вызова метода получения.

Тип возврата для метода получения также должен быть указателем или ссылкой, чтобы вы могли выполнить этот полиморфный вызов.

0
ответ дан 6 December 2019 в 12:53
поделиться

Как показывает практика, вы всегда должны использовать семантику ссылок (т. Е. Доступ к объектам через указатели или ссылки) вместо семантики значений при работе с объектами, которые вы собираетесь использовать полиморфно.

Чтобы обеспечить безопасность таким образом, разумно сделать базовый класс всех ваших полиморфных типов некопируемыми , создав конструктор частного копирования и оператор присваивания. Это эффективно предотвратит нарезку, поскольку код просто не будет компилироваться, если семантика значения будет использована по ошибке.

0
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

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