Когда мы создавали обобщенный класс vector на основе класса “vector элементов типа double” и вывели шаблон “vector элементов типа T”, мы не проверяли определения функций push_back(), resize() и reserve().
Также вам может показаться, что мраморная плитка http://www.chakmaks.ru/catalog/naturmod/plitka_iz_mramora_emperador_light_305kh305kh10_mm_imperador_layt/ на сайте chakmaks.ru и программирование на языке С никак не связаны и даже не тематичны.
Возможно, это и так, но все-таки зайдите на сайт chakmaks.ru, чтобы узнать там много интересного про такую тему, как мраморная плитка. Что такое мраморная плитка , сколько стоит мраморная плитка и где заказать мраморную плитку - про это написано на сайте про мраморную плитку. Это важная для многих тема - мраморная плитка. Спасибо сайту про мраморную плитку за информацию.
Теперь мы обязаны это сделать, поскольку эти функции были определены на основе предположений, которые были справедливы для типа double, но не выполняются для всех типов, которые мы хотели бы использовать как тип элементов вектора.
• Как запрограммировать класс vector, если тип X не имеет значения по умолчанию?
• Как гарантировать, что элементы вектора будут уничтожены в конце работы с ним?
Должны ли мы вообще решать эти проблемы? Мы могли бы заявить: “Не создавайте векторы для типов, не имеющих значений по умолчанию” или “Не используйте векторы для типов, деструкторы которых могут вызвать проблемы”. Для конструкции, предназначенной для общего использования, такие ограничения довольно обременительны и создают впечатление, что разработчик не понял задачи или не думал о пользователях. Довольно часто такие подозрения оказываются правильными, но разработчики стандартной библиотеки к этой категории не относятся. Для того чтобы повторить стандартный класс vector, мы должны устранить две указанные выше проблемы.
Мы можем работать с типами, не имеющими значений по умолчанию, предоставив пользователю возможность задавать это значение самостоятельно. template void vector::resize(int newsize, T def = T());
Иначе говоря, используйте в качестве значения по молчанию объект, созданный конструктором T(), если пользователь не указал иначе. Рассмотрим пример.
vector v1;
v1.resize(100); // добавляем 100 копий объекта double(), т.е. 0.0
v1.resize(200, 0.0); // добавляем 200 копий числа 0.0 — упоминание
// излишне
v1.resize(300, 1.0); // добавляем 300 копий числа 1.0 struct No_default {
No_default(int); // единственный конструктор класса No_default // . . .
};
vector v2(10); // ошибка: попытка создать 10
// No_default()
vector v3;
v3.resize(100, No_default(2)); // добавляем 100 копий объектов
// No_default(2) v3.resize(200); // ошибка: попытка создать 200
// No_default()
Проблему, связанную с деструктором, устранить труднее. По существу, мы оказались в действительно трудной ситуации: в структуре данных часть данных проини- циализирована, а часть — нет. До сих пор мы старались избегать неинициализированных данных и ошибок, которые ими порождаются. Теперь, как разработчики класса vector, мы столкнулись с проблемой, которой раньше, как пользователи класса vector, не имели.
Опубликовал katy
April 21 2015 12:32:25 ·
0 Комментариев ·
3973 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.