Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
Заблокирован

интеллектуальные указатели

07.10.2012, 00:39. Показов 4514. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Блин, не совсем понял зачем такой геморой нужен как эти указатели, но фиг с ним вопрос основной по коду, вот сделал по примеру с учебника, может есть косяки, вопросы выделил комментариями...
примкр класса1 и пример класса2, через кот передаются указатели классу1

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
#include <iostream>
using namespace std;
 
class use_point{
    friend class point;
    int* usei;
    size_t ix;
    use_point(int *iop):usei(iop),ix(1){}
    ~use_point(){delete usei;}
    };
 
class point{
    public:
    point(int inpv,int* inprv):val(inpv),rival(new use_point(inprv)){}
    point(const point &copy):val(copy.val),rival(copy.rival){++rival->ix;}
    point &operator=(const point &copy){ /*здесь может я накосячил в объявлении*/
        ++copy.rival->ix;
        if(--copy.rival->ix==0)/*совсем не понятно предназначение этой строчки*/
        delete rival;
        val=copy.val;
        rival=copy.rival;
        return *this;
        }
    ~point(){if(--rival->ix==0) delete rival;}
        
    int get_val()const{return val;}
    int* get_ref()const{return rival->usei;}
    void set_val(int pval){val=pval;}
    void set_ref(int* pri){rival->usei=pri;}
    int get_ref_val()const{return *rival->usei;}
    void set_ref_val(int prival){*rival->usei=prival;}
    
    private:
    int val;
    use_point* rival;
    };
    
    int main(){
        int* ri=new int(777);
        point one(*ri,ri);
        delete ri;
        point two=one;
        cout<<two.get_ref()<<" "<<two.get_ref_val()<<endl;
        return 0;
        }

Вот к вопросу о нужности\ненужности таких указателей. В учебнике ставился пример что допустим у класса описанного сверху rival это обычный указатель тогда если в main прописать этот же код
C++
1
2
3
4
5
6
7
8
int main(){
        int* ri=new int(777);
        point one(*ri,ri);
        delete ri;
        point two=one;
        cout<<two.get_ref()<<" "<<two.get_ref_val()<<endl;
        return 0;
        }
то в присвоении point two=one; произойдет "КАТАСТРОФА".... Вот, поэтому давайте сделаем указатель интеллектуальный, и вся эта куча лишнего кода из-за того, что присваивание идет после удаления объекта на кот указывает указатель, но что мешает так прописать (по нормальному)
C++
1
2
3
4
5
6
7
int* ri=new int(777);
        point one(*ri,ri);
        point two=one;
        cout<<two.get_ref()<<" "<<two.get_ref_val()<<endl;
                      delete ri;
        return 0;
        }
Добавлено через 48 минут
editing
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2012, 00:39
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++,...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

20
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.10.2012, 15:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
но что мешает так прописать (по нормальному)
Ничего не мешает. Но у тебя короткий пример из 5 строк, а потому в нём сразу хорошо видны все проблемы при неправильном написании. А вот когда у тебя проект состоит из нескольких десятков тысяч файлов, трудятся над ним несколько сотен людей, а объекты живут в программе в течение долгого времени, то на глаз проблемные места определить практически невозможно. Умные указатели придумали не потому, что без них невозможно, а для того, чтобы защитить себя от собственных же ошибок при написании кода
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.10.2012, 15:46

Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком
Смысл задания в том, что нужно отсортировать массив структур из 3х полей по сумме координат есть структура struct XYZ{ ...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели, как правильно разыменовать, где ошибка?
1)Есть класс: Shape - абстрактный; у него есть классы наследники: Circle, Triangle. 2)Eсть контейнер: vector &lt;Shape*&gt; Scontainer;...

Зачем нужны все эти указатели (или не указатели)
Зачем надо DWORD, HANDLE, LPVOID?


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru