Правильно ли я решил задание?
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;
};
{
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.
Все ли я обнаружил, правильно ли это?
2)Не высвобождается память(если это сборшик мусора), нет доступа к элементам(если это список).
Цитата: CassandraDied
2)Не высвобождается память(если это сборшик мусора), нет доступа к элементам(если это список).
Спасибо, хорошее замечание.
Над первой задачей конечно пришлось задуматься.
Цитата: CassandraDied
1) Никаких.
....мммм.
Но ведь подобная конструкция кода помогает создавать типа независимые списки.
При условии, что класс TObject является базовым для всех типов. Как object в С#.
Цитата: djordj23
Цитата: CassandraDied
1) Никаких.
....мммм.
Но ведь подобная конструкция кода помогает создавать типа независимые списки.
При условии, что класс TObject является базовым для всех типов. Как object в С#.
Класс не реализует основные методы списка. Класс вообще ничего не реализует. И какого называть его GarbageCollector, если это список?
Цитата: CassandraDied
Класс не реализует основные методы списка. Класс вообще ничего не реализует...
Вы это про класс TGarbageCollector ?
Цитата: CassandraDied
И какого называть его GarbageCollector, если это список?
Если я не ошибаюcь, то эта строчка кода
Код:
std::set<TObject *> _garbage;
Думаю, мы с вами отдаляемся от темы поста, давайте лучше вернемся к теме.