Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте, можно поконкретней, для чего нужен класс auto_ptr_ref? Спасибо.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.12.2015, 02:56
Ответы с готовыми решениями:

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

Для чего нужен класс ErrorException ?
Добрый день! Для чего нужен класс ErrorException ? Есть класс Error, есть - Exception. Я читал, чтобы - преобразовать ошибку в...

Для чего нужен класс QUuid?
Приветствую всех форумчан и джедаев Qt. Прошу прощения за нубский вопрос, но я только начинаю изучать библиотеку Qt. Можете,...

3
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.12.2015, 13:13
Цитата Сообщение от _stanislav Посмотреть сообщение
ожно поконкретней, для чего нужен класс auto_ptr_ref?
для истории.

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

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


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

с с++11 считаются устаревшими.
http://www.cplusplus.com/refer... o_ptr_ref/
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
19.12.2015, 15:57  [ТС]
Прошу прощения, я суть вопроса передал не верно.
Объясните пожалуйста принцип совместной работы auto_ptr и auto_ptr_ref.
1
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 732
13.12.2017, 15:20
Тоже вопрос возник.
Я правильно понимаю, что при возвращении созданного в функции объекта 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.12.2017, 15:20
Помогаю со студенческими работами здесь

Для чего нужен класс Activator
Подскажите пожалуйста как использования класс и в каких ситуациях его использовать? Заранее спасибо

Что такое шаблонный класс, и для чего он нужен?
Объяснительная​ пожалуйста, что такое шаблонный класс, и для чего он нужен? Никак не могу понять, если можно то с примером.

Для чего нужен класс Contract? Пример кода внутри.
Contract.Requires(windowHandle != IntPtr.Zero); Что-то не понятно, что делает этот метод из описания на МСДН тоже ничего не понял.

Для чего нужен Seed() и для чего его override?
Привет, ребята. Прочитал много разных статей про Seed(). И так и не могу понять зачем он нужен на практике. Вот выдержка одной из...

Для чего нужен C#?
Для чего нужен C#? На чем луче писать интернет-приложения и Online игры?


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru