434.___________________Часть lit. Современное программирование на C++

использует контейнер. Должен ли пользователь полностью отвечать за контейнер или контейнер должен сам уничтожать объекты, когда они удаляются из контейнера? Кто должен быть "собственником" объекта? Если контейнер нужен только как временное хранилище, а жизнь самого хранимого объекта дольше жизни контейнера, то контейнер, конечно, не может быть собственником. Если же хранимые объекты существуют только во время существования самого контейнера, то "право собственности" проще оставить за самим контейнером.

Каждый косвенный контейнер имеет базовый класс TShouldDelete, определенный в заголовочном файле shddel.h. Это позволяет легко выяснять и устанавливать принадлежность объектов контейнера через функцию-член OwnsElements (принадлежность элемента). Эта функция является перегружаемой функцией-членом и существует в двух формах. Первая форма позволяет пользователю запрашивать статус принадлежности и определяется в TShouldDelete следующим образом:

bool OwnsElements();

Она возвращает значение TRUE, если контейнер является собственником объекта, и FALSE в противном случае. Контейнер studentList из листинга 18.3 может запрашивать собственника следующим образом:

if (studentList.OwnsElements()==true) cout « "studentList — собственник своих объектов." « endl;

else cout « "studentList — не собственник своих объектов." « endl;

По умолчанию косвенные контейнеры являются собственниками хранимых ими объектов. Поэтому если принадлежность studentList не была установлена как-либо иначе, studentList () возвратит значение TRUE.

Вторая перегруженная функция позволяет устанавливать статус принадлежности:

void OwnsElements(bool,del);

Для установки принадлежности просто вызывается OwnsElements с аргументом TRUE или FALSE. Чтобы установить значение принадлежности для studentList, равное FALSE, следует вызвать:

studentList.OwnsElements(false);

а для инвертирования статуса studentList:

studentList.OwnsElements(!studentList.OwnsElements());

Листинг 18.4 иллюстрирует установку и использование статуса принадлежности.