Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

Класс auto_ptr - C++

12.06.2013, 16:34. Просмотров 397. Ответов 2
Метки нет (Все метки)

Добрый день. Вот мой вариант реализации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class T>
class Auto_ptr {
public:
    Auto_ptr(T* p) : pointer(p) { }
    ~Auto_ptr() { delete []pointer; }
 
    T& operator*() { return *pointer; }
    
    T* operator->() { return &*pointer; }
 
    T* release() { return pointer; }
 
private:
    T* pointer;
};
Всё работает, как нужно, за исключением деструктора. Подскажите, как можно описать деструктор, чтобы он верно обрабатывал случаи, когда нужно вызывать delete pointer; (память выделялась на 1 элемент) и delete []pointer; (освобождение блока)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2013, 16:34     Класс auto_ptr
Посмотрите здесь:

Auto_ptr - C++
Есть пару простых классов , раньше использовал простые указатели сейчас решил воспользоватся auto_ptr. В классе Duck есть : ...

констанстность auto_ptr - C++
auto_ptr&lt;Nod&gt;/*Nod**/ m_pRoot; void Insert1(auto_ptr&lt;Nod&gt;/*Nod**/ pRoot, int iValue){ if(m_pRoot.get() == 0) m_pRoot.get()...

Auto_ptr для хэндлов - C++
Необходимо придумать инструмент для работы с хэндлами файлов (аналог auto_ptr). Может кто-то что-то подобное уже делал?

Как использовать auto_ptr? - C++
Ищу, ищу, но нигде не могу найти на русском, да и на буржуйском, толковое описание использования auto_ptr. Везде только какие-то...

Передача auto_ptr по ссылке - C++
Передача auto_ptr по ссылке противоречит концепции владения. Нельзя быть полностью уверенным в том, что функция, получающая auto_ptr по...

Отличие get() и release() у auto_ptr - C++
Вопрос,конечно,глупой. Но не могу разобраться. В чём всё таки различение между auto_ptr&lt;int&gt; pi(new int(24)); cout&lt;&lt;pi.release();...

Сократить объявление auto_ptr для вновь создаваемого объекта - C++
Кстати, может кто подскажет... - в 3-й строке примера (std::autoptr...) можно как-то сократить запись, чтоб не повторять несколько раз new...

auto_ptr в connect() - C++ Qt
после того как заменил обычный указатель на умный std::auto_ptr&lt;QTimer&gt; timer(new QTimer); перестал работать connect(timer,...

Передать в функцию std::auto_ptr - C++ Builder
Доброго! Создаю массив std::auto_ptr&lt;TStringList&gt; lst(new TStringList); как правильно или в обще его передать в функцию, типа...

Отличие std::auto_ptr<SomeType> от boost::shared_ptr<SomType> - Boost C++
Господа программисты, хочу задать вам вопрос: чем умный указатель std::auto_ptr&lt;SomeType&gt; отличается от бустового умного указателя...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.06.2013, 17:00     Класс auto_ptr #2
частичная специализация
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
#include <iostream>
 
template<class T>
class AutoPtr
{
public:
    ~AutoPtr()
    {
        std::cout << "pointer" << std::endl;
    }
};
 
template<class T>
class AutoPtr<T[]>
{
public:
    ~AutoPtr()
    {
        std::cout << "array" << std::endl;
    }
};
 
int main()
{
    AutoPtr<int> ptr;
    AutoPtr<int[]> ptr2; 
}
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,262
Завершенные тесты: 1
12.06.2013, 18:07     Класс auto_ptr #3
Цитата Сообщение от PG94 Посмотреть сообщение
Подскажите, как можно описать деструктор, чтобы он верно обрабатывал случаи, когда нужно вызывать delete pointer; (память выделялась на 1 элемент) и delete []pointer; (освобождение блока)?
А зачем ?
pointer и array - это концептуально разные вещи, у них разный интерфейс, начнем с этого.
Например, для array логично будет иметь перегруженный оператор индексации, а в классе
pointer-а он смотрится нелепо. То же самое с перегрузкой "operator ->", да и с некоторыми
другими методами тоже.

По моему мнению, здесь стоит делать разные классы.
Как в Boost, к примеру - scoped_array/shared_array, scoped_ptr/shared_ptr.
Yandex
Объявления
12.06.2013, 18:07     Класс auto_ptr
Ответ Создать тему
Опции темы

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