На этом шаге мы рассмотрим способ задания принадлежности объектов.
Можно задать принадлежность объектов, создав косвенный контейнер, подобный TIArrayAsVector, и вызвав функцию, наследованную из класса TShouldDelete. Например, рассмотрим следующий косвенный контейнер, запоминающий указатели на строковые объекты:
TIАгrayAsVector<string> stuff(100);
Для того чтобы определить, владеет ли stuff своими объектами (по умолчанию владеет), следует вызвать функцию OwnsElements(), наследованную из класса TShouldDelete:
cout << stuff .OwnsElements() << endl;
Функция OwnsElements() возвращает истину (1), если контейнер владеет своими объектами, или ложь (0), если нет.
Для изменения статуса собственности в контейнере следует передать истину или ложь второй перегруженной функции OwnsElement(), которая ничего не возвращает. Вообще неплохо определить константы TRUE и FALSE для облегчения чтения текста программы:
#define TRUE 1 #define FALSE 0 ... stuff.OwnsElements(FALSE); // Запретить владение объектов
Такая отмена прав собственности контейнера stuff означает, что объекты не будут удаляться автоматически. Для разрешения автоматического удаления следует вызвать функцию OwnsElements() с аргументом TRUE;
stuff.OwnsElements(TRUE);
TArrayAsVector<string> stuff2(100);
вы не сможете изменить статус владения объектами stuff2:
stuff2.OwnsElements(TRUE); // ???
При компиляции этого оператора будет выдано сообщение об ошибке "'OwnsEIements' is not a member of 'TArrayAs Vector<string>'" ('OwnsElements' - не член 'TArrayAsVector <string>'), поскольку контейнерные классы, запоминающие сами объекты, не выводятся из класса TShouldDelete. Вы можете задать статус владения только для косвенных контейнеров, которые хранят указатели на объекты.
На следующем шаге мы рассмотрим использование принадлежности объектов.