Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
_stanislav
Рука
274 / 265 / 167
Регистрация: 16.08.2014
Сообщений: 1,254
Завершенные тесты: 2
#1

Для чего нужен класс auto_ptr_ref? - C++

19.12.2015, 02:56. Просмотров 292. Ответов 3
Метки нет (Все метки)

Здравствуйте, можно поконкретней, для чего нужен класс auto_ptr_ref? Спасибо.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2015, 02:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Для чего нужен класс auto_ptr_ref? (C++):

Описать класс "полином" - Для чего нужен конструктор по умолчанию?
неоюходимо написать класс для работы с полиномами в нете нашел что-то поожее...

Для чего нужен с++?
Я школьник, мне 16 лет, учусь в 10 классе, планирую поступить на факультет...

Для чего нужен символ \b?
для чего нужен символ \b??

Для чего нужен define?
Для чего нужен оператор define? например код #define N 20 /*...

Для чего нужен break?
для чего нужен break?

Для чего нужен Sizeof
Вот строка memcpy(pMatrPr, pMatr, sizeof(double) * n * m); Это копирование...

3
hoggy
Заблокирован
19.12.2015, 13:13 #2
Цитата Сообщение от _stanislav Посмотреть сообщение
ожно поконкретней, для чего нужен класс auto_ptr_ref?
для истории.

что бы будущие поколения знали, что вот когда то,
древние программисты использовали вот такие вещи.
и ужасались темным временам ранней эпохи с++.

Кликните здесь для просмотра всего текста


работает совместно с auto_ptr
оба передают эксклюзивное право владения объектом.

с с++11 считаются устаревшими.
http://www.cplusplus.com/reference/memory/auto_ptr_ref/
1
_stanislav
Рука
274 / 265 / 167
Регистрация: 16.08.2014
Сообщений: 1,254
Завершенные тесты: 2
19.12.2015, 15:57  [ТС] #3
Прошу прощения, я суть вопроса передал не верно.
Объясните пожалуйста принцип совместной работы auto_ptr и auto_ptr_ref.
1
AndrSlav
65 / 53 / 14
Регистрация: 20.12.2013
Сообщений: 429
13.12.2017, 15:20 #4
Тоже вопрос возник.
Я правильно понимаю, что при возвращении созданного в функции объекта auto_ptr (т.е. временного по сути) вызывается конструктор копирования для создания временной переменной вне функции и копирования в нее локальной переменной из функции. Но для этого нужен конструктор копирования с константным аргументом, а его нет. Располагаем следующим:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// TEMPLATE CLASS auto_ptr
template<class _Ty>
    class auto_ptr;
 
template<class _Ty>
    struct auto_ptr_ref
        {   // proxy reference for auto_ptr copying
    explicit auto_ptr_ref(void *_Right)
        : _Ref(_Right)
        {   // construct from generic pointer to auto_ptr ptr
        }
 
    void *_Ref; // generic pointer to auto_ptr ptr
    };
 
template<class _Ty>
    class auto_ptr
        {   // wrap an object pointer to ensure destruction
public:
    typedef _Ty element_type;
 
    explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
        : _Myptr(_Ptr)
        {   // construct from object pointer
        }
 
    auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
        : _Myptr(_Right.release())
        {   // construct by assuming pointer from _Right auto_ptr
        }
 
    auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
        {   // construct by assuming pointer from _Right auto_ptr_ref
        _Ty **_Pptr = (_Ty **)_Right._Ref;
        _Ty *_Ptr = *_Pptr;
        *_Pptr = 0; // release old
        _Myptr = _Ptr;  // reset this
        }
 
    template<class _Other>
        operator auto_ptr<_Other>() _THROW0()
        {   // convert to compatible auto_ptr
        return (auto_ptr<_Other>(*this));
        }
 
    template<class _Other>
        operator auto_ptr_ref<_Other>() _THROW0()
        {   // convert to compatible auto_ptr_ref
        _Other *_Testptr = (_Ty *)_Myptr;   // test implicit conversion
        auto_ptr_ref<_Other> _Ans(&_Myptr);
        return (_Testptr != 0 ? _Ans : _Ans);
        }
 
    template<class _Other>
        auto_ptr<_Ty>& operator=(auto_ptr<_Other>& _Right) _THROW0()
        {   // assign compatible _Right (assume pointer)
        reset(_Right.release());
        return (*this);
        }
 
    template<class _Other>
        auto_ptr(auto_ptr<_Other>& _Right) _THROW0()
        : _Myptr(_Right.release())
        {   // construct by assuming pointer from _Right
        }
 
    auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Right) _THROW0()
        {   // assign compatible _Right (assume pointer)
        reset(_Right.release());
        return (*this);
        }
 
    auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty> _Right) _THROW0()
        {   // assign compatible _Right._Ref (assume pointer)
        _Ty **_Pptr = (_Ty **)_Right._Ref;
        _Ty *_Ptr = *_Pptr;
        *_Pptr = 0; // release old
        reset(_Ptr);    // set new
        return (*this);
        }
 
    ~auto_ptr()
        {   // destroy the object
        if (_Myptr != 0)
            delete (_Ty *)_Myptr;
        }
 
    _Ty& operator*() const _THROW0()
        {   // return designated value
 
 #if _HAS_ITERATOR_DEBUGGING
        if (_Myptr == 0)
            _DEBUG_ERROR("auto_ptr not dereferencable");
 #endif /* _HAS_ITERATOR_DEBUGGING */
 
        return (*get());
        }
 
    _Ty *operator->() const _THROW0()
        {   // return pointer to class object
 
 #if _HAS_ITERATOR_DEBUGGING
        if (_Myptr == 0)
            _DEBUG_ERROR("auto_ptr not dereferencable");
 #endif /* _HAS_ITERATOR_DEBUGGING */
 
        return (get());
        }
 
    _Ty *get() const _THROW0()
        {   // return wrapped pointer
        return ((_Ty *)_Myptr);
        }
 
    _Ty *release() _THROW0()
        {   // return wrapped pointer and give up ownership
        _Ty *_Tmp = (_Ty *)_Myptr;
        _Myptr = 0;
        return (_Tmp);
        }
 
    void reset(_Ty* _Ptr = 0)
        {   // destroy designated object and store new pointer
        if (_Ptr != _Myptr && _Myptr != 0)
            delete (_Ty *)_Myptr;
        _Myptr = _Ptr;
        }
 
private:
    const _Ty *_Myptr;  // the wrapped object pointer
    };

В результате ищется другой конструктор копирования, и им оказывается
C++
1
2
3
4
5
6
7
auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
        {   // construct by assuming pointer from _Right auto_ptr_ref
        _Ty **_Pptr = (_Ty **)_Right._Ref;
        _Ty *_Ptr = *_Pptr;
        *_Pptr = 0; // release old
        _Myptr = _Ptr;  // reset this
        }
Поэтому сначала происходит преобразование переменной в функции в auto_ptr_ref, а затем вызывается этот конструктор копирования? Или не такая логика? А почему тогда так же не может просочится операция копирования константных аргументов?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2017, 15:20
Привет! Вот еще темы с решениями:

Для чего нужен EOF?
задание такое:написать программу, печатающую все вводимые символы в верхнем...

Для чего нужен rdstate()
Например cout&lt;&lt;&quot;sdxcfc&quot;&lt;&lt;output.rdstate(); Где output объект ostrstream

Объясните для чего нужен конструктор
Можете доступно объяснить для чего нужен конструктор, на примере этого кода. ...

Виртуальный деструктор, для чего нужен?
Я конечно понимаю, что Но объясните поподробнее и попонятнее для чего это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru