Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Правильно ли я решил задание?

84K
19 сентября 2012 года
djordj23
5 / / 19.09.2012
Здравствуйте. Уважаемые участники, не могли ли бы вы помочь мне в следующем задании.

C++ Builder / VCL
Для внутренних нужд был разработан следующий класс

Код:
class TGarbageCollector
   {
   public:

      template <class T>
      T* Add(T *g)
      {
         _garbage.insert(g);
         return g;
      }

      ~TGarbageCollector()
      {
         while (!_garbage.empty())
         {
            delete *_garbage.begin();
            _garbage.erase(_garbage.begin());
         }
      }

   private:

      std::set<TObject *> _garbage;
   };
Вопросы:
  • 1. Какие задачи можно решать с помощью данного класса?
  • 2. Какие проблемы Вы видите в данной реализации?

Мои ответы
  • 1. Класс TGarbageCollector позволяет создавать контейнер(список) объектов с любым типом списка, при условии, что передаваемый аргумент типа, является производным от класса TObject .
  • 2. a) Недопустимое использование оператора delete: delete *_garbage.begin(); Т.к возвращается итератор на первый элемент, затем происходит разыменовывание, а далее она как бы удаляется оператором delete. Однако такая запись является не правильной с точки зрения синтаксиса языка.

    b) Данный подход реализации не обеспечивает типовую безопасность. Аргумент типа, передаваемый в метод T* Add(T* g), может быть не пронаследован от TObject.

Все ли я обнаружил, правильно ли это?
414
19 сентября 2012 года
CassandraDied
763 / / 24.05.2012
1) Никаких.
2)Не высвобождается память(если это сборшик мусора), нет доступа к элементам(если это список).
84K
19 сентября 2012 года
djordj23
5 / / 19.09.2012
Цитата: CassandraDied
2)Не высвобождается память(если это сборшик мусора), нет доступа к элементам(если это список).



Спасибо, хорошее замечание.

Над первой задачей конечно пришлось задуматься.

84K
19 сентября 2012 года
djordj23
5 / / 19.09.2012
Цитата: CassandraDied
1) Никаких.



....мммм.
Но ведь подобная конструкция кода помогает создавать типа независимые списки.

При условии, что класс TObject является базовым для всех типов. Как object в С#.

414
19 сентября 2012 года
CassandraDied
763 / / 24.05.2012
Цитата: djordj23
Цитата: CassandraDied
1) Никаких.



....мммм.
Но ведь подобная конструкция кода помогает создавать типа независимые списки.

При условии, что класс TObject является базовым для всех типов. Как object в С#.


Класс не реализует основные методы списка. Класс вообще ничего не реализует. И какого называть его GarbageCollector, если это список?

84K
19 сентября 2012 года
djordj23
5 / / 19.09.2012
Цитата: CassandraDied

Класс не реализует основные методы списка. Класс вообще ничего не реализует...



Вы это про класс TGarbageCollector ?

Цитата: CassandraDied

И какого называть его GarbageCollector, если это список?



Если я не ошибаюcь, то эта строчка кода

 
Код:
std::set<TObject *> _garbage;
является ассоциативным контейнером.

Думаю, мы с вами отдаляемся от темы поста, давайте лучше вернемся к теме.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог