На днях столкнулся с одной интересной проблемой.
Понадобилось мне создать массив smart указателей. Не спрашивайте зачем.
Не долго думая, пишу следующий код —
[...]
class temp
{
};
typedef std::auto_ptr<temp> temp_ptr;
typedef typename std::deque<temp_ptr> temp_deque;
void main()
{
temp_ptr p(new temp);
temp_deque deq;
deq.push_back(p);
}
[...]
При компиляции ошибка, причем на строчку в недрах STL.
Начинаю разбираться. Не секрет, что при добавлении объекта, deque (как впрочем и остальные стандартные контейнеры) пользуются его копирующим коструктором. А конструктор, как изветно, принимает в качестве своего единственного параметра ссылку на константный копируемый объект. Но, (как я мог об этом забыть!) копирующий коструктор std::auto_ptr коренным образом отличается от своего _обычного_ собрата. Приставочки const у принимаемого объекта-то и нет. Не надо объяснять для чего это делалось разработчиками, и делалось конечно правильно, иначе как у копируемого объкта отобрать права владения указателем. Но вот мне — то как быть в этом случае?
По моему, даже если бы в std::auto_ptr кто-нибудь добрый добавил в конструкторе приставку const, а внутри применил преобразование типов — например const_cast, даже это не спасло бы отца русской демократии. Ведь ни кто не гарантирует что в STL не создадут (для каких нибудь профилактических целей) временный объект. И тогда права, отойдут в его безвременное, но к ложалению краткое

пользование. С соответствующими последствиями.
Или, что вероятнее, пользователь такого deque (например я) может забыть с чем имеет дело и получить копию объекта из массива.
Вот и захотелось мне поинтересоваться у всезнающего ALL. Как быть бедному мне в этом случае и как работать с подобными классами в стандартных контейнерах (имеются ввиду классы копии которых владеют одним ресурсом).
Здравствуйте, Greh, Вы писали:
G>Вот только что за boost такой? Я тут недавно, могу чего-то не знать.
http://www.boost.org/... << RSDN@Home 1.1 beta 1 >>
Здравствуйте, Greh, Вы писали:
G>Не долго думая, пишу следующий код -
G>[...]
G>typedef std::auto_ptr<temp> temp_ptr;
G>typedef typename std::deque<temp_ptr> temp_deque;
G>[...]
Мне это все напоминает "Как сварить яйцо в микроволновке" Леонида Каганова:
Q: Сколько времени надо варить куриное яйцо в микроволновке? Микроволновка "Bosh".
A: Яйца нельзя варить в микроволновке потому что они взрываются. Используйте кастрюлю и обычную плиту.
Q: Как надо обработать яйцо чтобы сварить его в микроволновке?
A: Не существует способа сварить яйцо в микроволновке.
Q: Как именно происходит взрыв яйца с точки зрения науки и почему?
A: Яйцо резко теряет целостность и приобретает форму стенок печки. Это происходит из-за нагревания в печах микроволнового типа. Кулинарная наука запрещает это делать.
Q: Я налила в стеклянную кастрюлю воды чтобы уравнять осмотическое давление, положила два яйца, накрыла тарелкой и поставила в печку. Вода еще не закипела, а яйца уже взорвались и разбили тарелку!
A: Вы забыли посолить воду. Кастрюля должна быть металлической, печка — обычная, не микроволнового типа.
Q: Я сварил яйцо отдельно вкрутую, а затем поставил разогреть на 20 секунд. Оно взорвалось. В чем моя ошибка?
A: Не следовало разогревать яйцо. Вы могли съесть его холодным или разогреть, опустив в горячую воду на 2-5 минут.
Q: Как при помощи микроволновки познакомиться с мужчиной? Мне 27 лет, рыба.
A: Не следует готовить яйца в микроволновке, сходите на вечеринку или дискотеку.
Ну и т.д., в том же духе на
http://lleo.aha.ru/arhive/esse/ej/mikrowave.shtml.
Ну нельзя хранить std::auto_ptr в стандартных контейнерах!
А насчет буста — дык
http://boost.org/. Берешь оттуда boost::shared_ptr и хранишь себе на здоровье.
Здравствуйте, retalik, Вы писали:
R>Здравствуйте, Greh, Вы писали:
G>>Не долго думая, пишу следующий код -
G>>[...]
G>>typedef std::auto_ptr<temp> temp_ptr;
G>>typedef typename std::deque<temp_ptr> temp_deque;
G>>[...]
R>Мне это все напоминает "Как сварить яйцо в микроволновке" Леонида Каганова:
R>Ну нельзя хранить std::auto_ptr в стандартных контейнерах!
^^^^^
Спасибо тебе, добрый человек на добром же слове, понял я это уже, давно понял, если ты внимательно читал мою мессагу. Но все равно спасибо, за совет, за мудрость твою, за поучение меня, дурака этакого....
А насчет буста — дык
http://boost.org/. Берешь оттуда boost::shared_ptr и хранишь себе на здоровье.
^^^
А вот теперь действительно спасибо.