Онлайн библиотека PLAM.RU


  • 1. Обработка обращения к NULL.
  • 2. Отладка и трассировка.
  • 3. Статистика классов и объектов.
  • 4. Кэширование.
  • Шаг 3 - Как это применять.

    Берем код параметризированного класса.

    template ‹class T›

    class SmartPointer {

    private:

     T* tObj;

    public:

     SmartPointer(T* _t=NULL): tObj(_t);

     ~SmartPointer() {if (tObj) delete tObj;}

     operator T*(){return tObj;}

     T* operator-›(){return tObj;}

    };

    1. Обработка обращения к NULL.

    Заменяем реализацию оператора -› на:

    T* operator-›() {

     if (!tObj) {

      cerr ‹‹ "NULL";

      tObj = new T;

     }

     return tObj;

    }

    или

    T* operator-›() {

     if (!tObj) throw CError;

     return tObj;

    };

    Здесь CError класс исключения. Или втыкаем статический экземпляр-шпион.

    private:

     T* tObj; // Это было;

     static T* spy; // Это добавлено

    Ну и сам перегруженный оператор.

    T* operator-›()
    {

     if (!tObj) return spy;

     return tObj;

    };

    Здесь нужно пояснить: spy совсем не обязательно класса T. Можно воткнуть производный, и переопределить его функции. Тогда он будет Вам докладывать о попытках обращения к NULL. Не забудьте его создать, инициализировать, и прицепить к указателю. А то вся идея на помойку. Вы пытаетесь отловить обращение к NULL, а там… NULL!!! "Матрицу" видели?

    2. Отладка и трассировка.

    Ну это совсем банально. Выносим определение операторов за определение класса и ставим там точку останова. Чтобы не тормозило в релиз версии, окружаем слово inline ифдефами.

    template ‹class T›

    #ifndef DEBUG

    inline

    #endif

    SmartPointer‹T›::operator T*()
    {

     return tObj;

    }


    template ‹class T›

    #ifndef DEBUG

    inline

    #endif

    T* SmartPointer‹T›::operator T-›()
    {

     return tObj;

    }

    3. Статистика классов и объектов.

    Ну все, здесь уже совсем все просто. Ничего писать не буду, кроме напоминания о том, что всенепременнейше нужно определять статистические переменные класса, в том числе и для параметризированного (то бишь для шаблона), и ровно один раз.

    4. Кэширование.

    Здесь сложнее. Об этом мне самому нужно почитать и полапать руками. Идея, как можно догадаться, в том, что если при обращении к умному указателю объект отсутствует в памяти, он считывается с диска. Проблемы самые очевидные в том, когда его снова отгружать на диск, разрушать объект, и как гарантировать единичность копии объекта при наличии многих ссылок.

    Так. Пока тормозим. Интересно, о чем я напишу следующий шаг?









    Главная | Контакты | Нашёл ошибку | Прислать материал | Добавить в избранное

    Все материалы представлены для ознакомления и принадлежат их авторам.