С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Ronan
1 / 1 / 0
Регистрация: 28.06.2013
Сообщений: 29
#1

Умный указатель - C++

29.07.2013, 14:50. Просмотров 3430. Ответов 14
Метки нет (Все метки)

Здраствуйте. Есть такое задание
Задание

Тема: «Работа с указателями. Указатели на функцию.»
Цель: создать свой собственный ”умный указатель”. Применить указатель и протестировать его работу.

Задание:

1) Разобраться с принципами работы “умных указателей” (см. материалы лекции №2). Создать собственноручно написанный ”умный указатель”.

2) Для хранения данных о ноутбуках описать структуру, вид которой приведен ниже (дополнить ее методами доступа к свойствам структуры). Создать массив ”умных указателей” на объекты подготовленного типа.

C++
1
2
3
4
5
6
7
8
9
struct NOTEBOOK{
    struct size         // габаритные размеры
    { 
        float x:
        float y;
        float z;
    };
    float w;    // вес
}
3) Расширить функционал программы:
3.1. Написать функцию, которая сортирует массив структур приведенного типа по весу;
- вх. параметры: массив;
3.2. Написать функцию, которая сортирует массив структур приведенного типа по объему;
- вх. параметры: массив;
3.3. Написать функцию, которая читает данные о ноутбуках из файла note.txt в структуру приведенного вида.
- вх. параметры: имя файла, указатель на заполняемый массив;
- для работы с файлами использовать потоки С++.
3.4. Написать функцию, которая записывает содержимое структуры в файл.
- вх. параметры: массив, указатель на функцию сортировки (можно передавать указатель на любую функцию сортировки), имя выходного файла;
- для работы с файлами использовать потоки С++.
3.5. Написать программу тестирования.




Внимание: применить все свои навыки и возможности, чтобы разрабатываемая программа не „валилась” от неразумных действий пользователя.



В книге которую я прочел нету ничего про умный указатель. Подскажите что это такое и как ним пользоваться.. и что я должен делать в задании... Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2013, 14:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Умный указатель (C++):

Умный указатель - C++
Не могу понять тему с перегрузкой оператора селектор и найти понятное объяснение этой темы. А так же реализацию умного указателя. ...

Декоратор и умный указатель - C++
пускай у нас есть, например, декоратор - для примера возьмем реализацию с википедии, через shared_ptr. #include <iostream> #include...

Функция, возвращающая умный указатель - C++
Здравствуйте, помогите пожалуйста создать функцию, возвращающую умный указатель. Мой вариант не рабочий: class InterfaceVideo{ public:...

Умный указатель и динамический массив - C++
Здравствуйте! Есть проблема со следующим заданием. Есть класс умного указателя, используя его необходимо, создать каталог товаров (+ 2...

Умный указатель своими руками - C++
Доброго времени суток. Изобразил следующую структуру: имеется класс-контейнер, фактически обертка для одномерного массива. И...

Каст нулевого литерала в умный указатель - C++
читаю я сейчас modern effective c++ и столкнулся с примерно таким листингом void foo(std::shared_ptr<std::string> x) { if (x) { ...

14
Catstail
Модератор
22915 / 11281 / 1833
Регистрация: 12.02.2012
Сообщений: 18,493
29.07.2013, 16:54 #2
Почитай это
0
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
29.07.2013, 17:40 #3
Цитата Сообщение от Ronan Посмотреть сообщение
Создать массив ”умных указателей” на объекты подготовленного типа.
cтранноватое задание, если я ничего не путаю надо создать аналог smart_ptr, но вроде как их нельзя засовывать в массивы вектора и т.д

Добавлено через 2 минуты
суть "умного указателя" - уйти от утечек памяти, когда по указателю создаем объект в какой то ф-ции, а потом забываем его удалить, после выхода из ф-ции "умный указатель" чистит за собой память, а насчет их копирования есть 2 варианта, не копировать их вообще, или передавать значение указателя копии, а самому эту область памяти не чистить

Добавлено через 1 минуту

Не по теме:

ой аналог auto_ptr

0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.07.2013, 17:41 #4
Цитата Сообщение от aLarman Посмотреть сообщение
вроде как их нельзя засовывать в массивы вектора и т.д
Можно, если эти указатели можно копировать и\или перемещать

Добавлено через 48 секунд
Для массива вообще нужен только конструктор по умолчанию
0
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
29.07.2013, 17:44 #5
Цитата Сообщение от gray_fox Посмотреть сообщение
Можно, если эти указатели можно копировать и\или перемещать
так я не спорю, просто сама концепция "умных указателей" не позволяет этого делать
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.07.2013, 17:46 #6
aLarman, shared_ptr/unique_ptr?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.07.2013, 17:56 #7
Цитата Сообщение от aLarman Посмотреть сообщение
просто сама концепция "умных указателей" не позволяет этого делать
Концепция "умных указателей"? То, что у auto_ptr проблемы с этим - так это проблемы auto_ptr, а не интелектуальных указателей.
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
29.07.2013, 18:01 #8
примерно вот так...
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
#include <iostream>
#include <functional>
 
template <class T>
class unique_ptr
{
    using pointer = T*;
    using reference = T&;
    using Deleter = std::function<void(pointer)>;
 
    pointer ptr;
    Deleter deleter;
 
    struct default_deleter
    { void operator () (pointer p) { delete p; } };
 
public:
    unique_ptr() noexcept : ptr(nullptr), deleter(default_deleter()) {}
 
    unique_ptr(pointer p, Deleter del = default_deleter()) : ptr(p), deleter(del) {}
 
    unique_ptr(const unique_ptr&) = delete;
 
    unique_ptr(unique_ptr &&x) noexcept : ptr(x.ptr), deleter(x.deleter)
    {
        x.ptr = nullptr;
    }
 
    ~unique_ptr()
    {
        deleter(ptr);
    }
 
    unique_ptr& operator = (const unique_ptr&) = delete;
 
    unique_ptr& operator = (unique_ptr &&x) noexcept
    {
        ptr = x.ptr;
        x.ptr = nullptr;
        deleter = x.deleter;
        return *this;
    }
 
    reference operator * () const
    {
        return *ptr; // !!! *nullptr
    }
 
    pointer operator -> () const noexcept
    {
        return ptr;
    }
 
    pointer get() const noexcept
    {
        return ptr;
    }
 
    void reset(pointer p = nullptr) noexcept
    {
        this->~unique_ptr();
        ptr = p;
    }
 
    pointer release() noexcept
    {
        pointer p = ptr;
        ptr = nullptr;
        return p;
    }
};
 
struct Foo
{
    ~Foo() {std::cout << "~Foo\n";};
};
 
int main()
{
    unique_ptr<Foo> p1( new Foo );
    unique_ptr<Foo> p2(new Foo[10], [](Foo *p){delete[] p;});
    return 0;
}
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.07.2013, 18:44 #9
Olivеr,
C++
1
unique_ptr(unique_ptr &&x) noexcept : ptr(std::move(x.ptr)), deleter(std::move(x.deleter))
C++
1
2
ptr = std::move(x.ptr);
deleter = std::move(x.deleter);
0
gray_fox
29.07.2013, 18:46
  #10

Не по теме:

Цитата Сообщение от Olivеr Посмотреть сообщение
reference operator * () const
Можно сделать noexcept

1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
29.07.2013, 18:51 #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Olivеr,
C++
1
unique_ptr(unique_ptr &&x) noexcept : ptr(std::move(x.ptr)), deleter(std::move(x.deleter))
C++
1
2
ptr = std::move(x.ptr);
deleter = std::move(x.deleter);
а чем тогда объект x будет удалять ptr(nullptr) в своем деструкторе?

Добавлено через 4 минуты
вот что я имел в виду
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Foo
{
    std::function<void()> f;
    Foo()
    {
        f = [](){ std::cout << "~Foo\n"; };
    }
 
    Foo(Foo &&x) : f(std::move(x.f)) {}
 
    ~Foo() { f(); }
};
 
int main()
{
    Foo a;
    Foo b( std::move(a) );
    return 0;
}
~Foo
terminate called after throwing an instance of 'std::bad_function_call'
what(): bad_function_call
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.07.2013, 18:55 #12
Olivеr, move конструктор, который на самом деле делает копию? Слишком нелогично, не находите?

C++
1
unique_ptr(unique_ptr&& u) noexcept;
Effects: Constructs a unique_ptr by transferring ownership from u to *this. If D is a reference type,
this deleter is copy constructed from u’s deleter; otherwise, this deleter is move constructed from u’s
deleter. [ Note: The deleter constructor can be implemented with std::forward<D>. —end note ]
Postconditions: get() yields the value u.get() yielded before the construction. get_deleter()
returns a reference to the stored deleter that was constructed from u.get_deleter(). If D is a
reference type then get_deleter() and u.get_deleter() both reference the same lvalue deleter.
C++
1
~unique_ptr();
Effects: If get() == nullptr there are no effects. Otherwise get_deleter()(get()).
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
29.07.2013, 19:06 #13
ForEveR, тогда добавить проверку в деструктор что ли?
C++
1
2
3
4
5
6
7
8
9
10
    unique_ptr(unique_ptr &&x) noexcept : ptr(x.ptr), deleter(std::move(x.deleter))
    {
        x.ptr = nullptr;
    }
 
    ~unique_ptr()
    {
        if (ptr)
            deleter(ptr);
    }
Добавлено через 55 секунд
и, кстати, перемещение указателя не устанавливает его в nullptr
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.07.2013, 19:07 #14
Olivеr, Именно так сделано в unique_ptr, да. Перемещение указателя не устанавливает конечно (по сути будет в любом случае копия указателя), однако выглядит это несколько логичнее, если мы пишем move конструктор - все члены должны быть именно перемещены (используя std::move).
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
29.07.2013, 20:53 #15
Вот еще один пример: http://ideone.com/ztKaAd
1
29.07.2013, 20:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2013, 20:53
Привет! Вот еще темы с ответами:

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

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

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...


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

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

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