Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] auto_ptr, оператор присваивания и конструктор копирования 23.03.09 12:37
Автор: Heller <Heller> Статус: Elderman
|
Решил реализовать свой собственный auto_ptr в качестве упражнения (ибо я не большой спец по C++, поэтому решил начать с малого). Сразу возникли непонятные моменты.
Моя реализация:
template<typename T>
class auto_ptr
{
T *object;
public:
explicit auto_ptr(T *p = 0) : object(p) {}
template<typename K>
auto_ptr(auto_ptr<K> &p) : object(static_cast<T*>(p.release()))
{
}
template<typename K>
auto_ptr& operator=(auto_ptr<K> &p)
{
object = static_cast<T*>(p.release());
return *this;
}
auto_ptr& operator=(auto_ptr &p)
{
object = p.release();
return *this;
}
~auto_ptr()
{
delete object;
}
T& operator*() const {return *object;}
T* operator->() const {return object;}
T* release() {T* t = object; object = 0; return t;}
void reset() {delete object; object = 0;}
};
---
Я не вижу никаких особых недостатков моего подхода. Однако я смотрю на реализацию в STL и не понимаю - зачем им auto_ptr_ref? Просто не вижу в нем смысла. Буду признателен, если кто-либо мне это объяснит.
Так же по ходу реализации auto_ptr возникли непонятности с оператором присваивания и конструктором копирования. Как видно из кода, мне пришлось реализовывать два оператора присваивания - теплейтный и «обычный». Это связано с тем, что компилятор (VC++ 2005 - если в новых версиях это иначе, прошу сообщить) генерит дефолтовый operator=, и игнорирует мой темплейт. Это вполне есественно - зачем инстанцировать темплейт, когда уже определена конкретная функция? Однако возникает непонятка: почему же он тогда инстанцирует темплейтный копирующий конструктор, а не использует сгенерированный дефолтовый, ведь и тот и другой генерируются по умолчанию?
В общем, я лично в замешательсве.
|
|
На первый вопрос ответить довольно легко 23.03.09 22:20
Автор: amirul <Serge> Статус: The Elderman
|
> Я не вижу никаких особых недостатков моего подхода. Однако > я смотрю на реализацию в STL и не понимаю - зачем им > auto_ptr_ref? Просто не вижу в нем смысла. Буду > признателен, если кто-либо мне это объяснит. На первый вопрос ответить довольно легко
http://lmgtfy.com/?q=auto_ptr_ref
> что компилятор (VC++ 2005 - если в новых версиях это иначе, > прошу сообщить) генерит дефолтовый operator=, и игнорирует 9-я (2008-я) SP1 поступает так же
> мой темплейт. Это вполне есественно - зачем инстанцировать > темплейт, когда уже определена конкретная функция? Однако > возникает непонятка: почему же он тогда инстанцирует > темплейтный копирующий конструктор, а не использует > сгенерированный дефолтовый, ведь и тот и другой > генерируются по умолчанию? Вот с этим сложнее. Чувствую нужно очень внимательно читать главы 12.8 и 14.8.2 стандарта. Проще забить
> В общем, я лично в замешательсве.
|
| |
Ужос 23.03.09 23:09
Автор: Heller <Heller> Статус: Elderman Отредактировано 23.03.09 23:30 Количество правок: 1
|
> На первый вопрос ответить довольно легко > http://lmgtfy.com/?q=auto_ptr_ref Да, мне стыдно, не знаю что со мной произошло :-(
В общем, почитал. Ужос. Грязные хаки. Подумалось вдруг: если уж хаки применять, то можно было бы определить копирующий конструтор c константной ссылкой, а внутри его конст-кастить указатель. Вроде то же на то же. Хотя признаться я до конца так и не понял каким образом он так ловко находит сам собой этот auto_ptr_ref. Видимо (очевидно), я не очень хорошо понимаю правила приведения типов в C++.
В общем спасибо за помощь.
|
| | |
Const_cast-ить не надо. Можно просто объявить mutable 24.03.09 00:08
Автор: amirul <Serge> Статус: The Elderman
|
> копирующий конструтор c константной ссылкой, а внутри его > конст-кастить указатель. Вроде то же на то же. Хотя Но тогда будет работать код, который работать не должен:
http://www.josuttis.com/libbook/auto_ptr.html
#include <memory>
void
f(auto_ptr<int> p) { // Твой auto_ptr
*p = 24;
}
void
g(std::auto_ptr<int> p) {
*p = 24;
}
void
main() {
const auto_ptr<int> p1(new int);
const std::auto_ptr<int> p2(new int);
*p1 = 42;
*p2 = 42;
f(p1);
g(p2)
}
---
> признаться я до конца так и не понял каким образом он так > ловко находит сам собой этот auto_ptr_ref. Видимо > (очевидно), я не очень хорошо понимаю правила приведения > типов в C++.
> В общем спасибо за помощь. Ага. И таки да, это хак. Еще один забавный хак - бустовый unspecified_boolean_type в умных указателях.
|
|
|